2016-08-30 15 views
1

宣言または定義を一度に定義した後で構造変数を定義できますか?すべて一緒に変数宣言後の構造変数の初期化/定義が完了しました

asd = {21,'H'}; 

のような単一のブレースそれは例えば、宣言されている場所:struct asd = {21,'H'};それは同じ行に定義することができますので、それは、実行することはできません場合は、任意の特定の理由で?

struct test 
{ 
    int a; 
    char b; 
}asd; 

asd = {21,'H'}; // error: expected an expression 

Cのプログラミングについて尋ねられます。

+0

集約の初期化が割り当てと異なるため、 –

+0

fyi: 'auto asd = {21、 'H'};'は動作しません。 'auto asd = {21,22};'はコンパイルしますが、あなたが求めていることはしません。 –

+6

言語を選択してください。 cはC++ではありませんcではありません。 –

答えて

0

明示的な型キャストが必要です。

struct test 
{ 
    int a; 
    char b; 
} asd; 

asd = (struct test){21,'H'}; 

このコードは、次のものとほぼ同じである。

const struct test initialiser = {21,'H'}; 
... 
asd = initialiser; 

差は、コンパイラがの割り当てを最適化するオプションを有していることです値をasd変数に設定します。そのような最適化がconst構造体コピーの初期化よりも効率的な場合は、即値を使用するアセンブラ命令を使用します。

「側」効果として、この構文は両方CC++

+0

@ 2501それは特定の名前を持っているかわかりませんでした。私に教えてくれませんか? – Serge

+0

@nathanoliver 1. struct asd [5]についても同じことができるでしょうか?その宣言の後に? *(asd + 3)=(struct tt){-2、 '\ 0'}とは異なります。しかし、配列のすべての要素が1行にまとめられています。 2.すべての通常の配列はint ary [5] = {1,22,31,231,5}のようにできます。その宣言後に行うことができますか?例:ary =(int){1,22,31,231,5}; – Lpdnn

+0

@Lpdnn unfortunatellyいいえ、この方法で配列を割り当てることはできません。唯一の回避策は、配列を構造体のメンバにすることです。 – Serge

0
struct test 
{ 
    int a; 
    char b; 
}asd; 

に有効であるがstructtestの定義と種類testの変数asdです。 には、asdという既定の構成オブジェクトがあります。あなたは

asd = {21, 'H'}; 

をしようとするとあなたはasdに代入しようとし、それが初期化リストを受け取り代入演算子を持っていないので、動作しませんリストを支えています。

あなたは

struct test 
{ 
    int a; 
    char b; 
}asd = {21, 'H'}; 

ようにそれを宣言するときにasdを初期化するか、またはあなたはそれが関数内で行われなければならないことに注意してください割り当てを使用することを選択したならば

asd = (struct test){21, 'H'}; 

のような割り当てを行うことができますいずれかグローバルな空間ではない。

+0

アサインメントはメインになければなりません。それ以外の場合、このエラーが発生します: 'error: 'asd'はタイプに名前を付けません。 ' –

+0

@ArnavBorborah – NathanOliver

+0

@Lpdnn私はC++構文を使用していました。私はCの構文で答えを更新しました。 – NathanOliver

0

@CaptainObliviousは、前述のように:

–aggregate initialization is different from assignment.

をこれが何を意味するのか、あなたはこのように、明示的または別々ことなく、後で集約オブジェクトに対して割り当てに集約初期化を使用傾けることです:

struct test 
{ 
    int a; 
    char b; 
}asd; 
int main() {asd.a = 21; asd.b = 'H'} 

これを行うには別の方法が後で明示されます(これは、メインまたは別のコードブロックで行う必要があります。エラーが発生した場合はasd does not name a type

asd = test{21,'H'} 

あなたがすることができるもう一つはこれです:

struct test 
{ 
    int a; 
    char b; 
}asd = {21,'H'}; 

ここに見られるように上記のいずれもが、同様に動作します: Live Example

-1

あなたはその型の変数を定義している場合のようにstruct部分を含める必要があります。しかし、この定義と初期化はすべて一緒にうまく動作します。

struct test 
{ 
    int a; 
    char b; 
} asd = { 21, 'H'}; 
+0

OPは、定義と初期化を一度に実行できるかどうかを尋ねました。私の答えはできることを示しています。素敵なダウンボートありがとう。あなたがよく知っているなら、あなたの知識を共有してください。そうすれば私たちはすべて利益を得るかもしれません。 –

関連する問題