2016-04-24 9 views
0

中のstruct fielsのCONSTを作る:は、構造体の特定のC

struct not_const { 
    int a; 
    char *b; 
} nc; 

それはnot_constのconstのバージョンにそれをキャストするために動作します:?

struct const_version { 
    const int a; 
    const char *b; 
}; 
struct const_version *c = (struct const_version *)&nc; 

任意のパディング問題があるだろうか? 私は透明な組合について聞いたことがありますが、私はそれらが関数のパラメータとしてのみ使用されていると思います。

ありがとうございます。

+0

あなたが 'const'メンバを持っているなら' const'初期化子が必要です。 –

+2

'char * b'のconstバージョンは' const char * 'ではなく' char * const b'です。ポインタはconstでなければならず、 'char'が指し示す場所ではありません。 – mch

+1

なぜあなたはそのようなconst構造体を持ちたいでしょうか?単純に 'const not_const'を使わないのはなぜですか? – Holt

答えて

-1

私には、整列についてのいくつかの懸念があるとは思われません。バイナリレベルでは、これらのタイプは互換性があります。あなたは望むならこの方法で行くことができます(Cで書かれたたくさんのもの - たくさんのネットワークコード、sockaddr_in/sockaddr_in6 - あなたが望むならヘッダファイルをチェックすることができます)。しかし、他の人々が述べたように、変数/引数をconstにする方が良いですし、結果的に厳密な参照ルール違反が解消されます。

2

タイプは同じではなく、互換性がありません。コードはstrict-aliasingに違反します。

コンパイラは、構造体メンバ間に異なる量のパディングを配置できます。

あなたはconstのメンバーは、元の構造体の定義を使用してのconstへのポインタを使用取得したい場合:

const struct not_const* c = (const struct not_const*)&nc; 

それが必要として、この行は、コンパイルエラーが発生します。

c->a = 123; 
+0

'const char * b;'はstrict-aliasingルールに違反しますが、 'struct const_version'に' char * const b; 'がある場合はどうなりますか? –

+1

@sunqingyao構造体定義が同一で、同じパディングを持つ場合でも、同じタグがない場合は互換性がありません。 – 2501

+0

だから私は 'char *'を置くのですが、構造体のすべてのフィールドの「非適合性」を保証する方法はありませんか? –

0

他の回答の問題は、データが他の機関を介して依然として変更可能であることです。

const struct not_const* c = (const struct not_const*)&nc; 
nc->a=some_other_value; // will still change the data. 

一つの解決策は、cのためのいくつかのメモリを割り当て、それにncをコピーすることです。

non_const obj1; 
printf("Enter non_const int : "); 
scanf("%d",&obj1.a); 
obj1.b="SomeString"; 

/* Declare a const version */ 
const non_const *obj3; 
/* Allocate the memory */ 
obj3=malloc(sizeof(obj1); 
/* Copy the first object */ 
memcpy(obj3,&obj1,sizeof(obj1)); 
/* You may see a warning: passing argument 1 
* of ‘memcpy’ discards ‘const’ qualifier from pointer target type 
* which can be neglected if i am not mistaken 
*/ 
+0

実際、小規模の学校プロジェクトではプラグインシステムを開発していますが、メインプログラムから情報を読むことができるようにすることはできませんが、書き込みはできませんが、これらの情報はいつでも変更できます。 –

+0

@NicolasScottoDiPerto:もうひとつの答えはあなたの必要性を満たしていました – sjsam