2011-01-23 23 views
36
typedef struct { 
    int hour; 
    int min; 
    int sec; 
} counter_t; 

そしてコードでは、明示的に各メンバ変数を初期化せずにこの構造体のインスタンスを初期化したいと思います。このための構文を覚えていませ、としませんでしたか10時30分47秒Cの構造体をインラインに割り当てる方法は?

ではなく

counter.hour = 10; 
counter.min = 30; 
counter.sec = 47; 

ため

counter_t counter; 
counter = {10,30,47}; //doesn't work 

:つまり、私のような何かをしたいと思いますすぐにGoogle検索からこれを行う方法を見つける。

ありがとうございます!

+5

それはうまくいくはずです。 –

+1

'counter_t counter = {10,30,47}'と同じ行で宣言をしても、この代入の前に宣言が行われていないとうまくいくようです。 – mindthief

+5

@Oli:それはなぜ機能するのですか?書かれているように、それは割り当てであり、初期化ではありません。 – sth

答えて

69

初期化:

counter_t c = {10, 30, 47}; 

割付:

c = (counter_t){10, 30, 48}; 

後者は "リテラル化合物" と呼ばれます。保守性のために

+7

これには、GCCまたはC99が必要であり、厳密なC89またはC++コンパイラは必要でないことに注意してください。 –

+9

@Jeremiah:良い点、私はC++タグに気付かなかった。 C89に関しては、人々が "C89"を意味するときに "C"と言って回っていれば、彼らは私が心配している限り、自分自身である;-) –

+0

ええ、私はちょうどそれも考え出した - (counter_t){10,30,47}あなたの提案したものと同じです。 "化合物リテラル"え?ありがとう! – mindthief

7

次のように私は、明示的に識別変数を使用して、リストの構文を好む:

counter_t counter = {.hour = 10, .min = 30, .sec = 47}; 

または例えば、インラインを返す:

return (struct counter_t){.hour = 10, .min = 30, .sec = 47}; 

私は1つのシナリオを想像することができます変数が宣言された順序を変更します。変数を明示的に指定しないと、変数の順序を修正するためにすべてのコードを実行する必要があります。このように、私が

余談が思うよりクリーンで読みやすいです:

@AshleyDuncanと@MMプットとして、この機能はC99 https://stackoverflow.com/a/12122261/2770195後にISO C++から削除されましたが、サポートされていますgnuのC + +で。

ですから、うまくこれを行うことができますが:

# need an example. I was unable to find. Even clang++ supports it. If you know 
# one, please suggest an edit 

すると、あなたがサポートしているC++コンパイラでコンパイルする必要がある場合:あなたは上記の例をしようとした場合

g++ -std=gnu++11 main.cpp -o main 

これは、エラーがスローされますこのgnu拡張を認識しないISO C++ 11以降では、単純なコンストラクタを持つクラスを使用する必要があります。

// backup workaround 
// not cool 
class gnuFTW { 
public: 
    int hour; 
    int min; 
    int sec; 
    gnuFTW(int hour, int min, int sec) { 
     this->hour = hour; 
     this->min = min; 
     this->sec = sec; 
    } 
}; 

int main(int argc, const char * argv[]) { 
    gnuFTW counter = gnuFTW(10,30,47); 
    cout << counter.hour << endl; 
    return 0; 
} 
+2

私はこれも好きですが、C++でコンパイルしたい場合はあまり良くありませんが、C++でサポートされていないC99のみの機能です。 https://stackoverflow.com/questions/12122234/how-to-initialize-a-struct-using-the-c-style-while-using-the-g-compiler –

+0

それを知らなかった。それは残念ですが、それはそのような便利な機能です。このケースで私が思う最良のアプローチは、Don Doernerのソリューションです:https://stackoverflow.com/a/14206226/2770195。簡単に言えば、変数と1つの初期化子を持つクラスを使用します。良い習慣のようには見えませんが、まさに構造体がしていることです。 – MuhsinFatih

+0

私は混乱しています。私はちょうど-gnu ++ 11オプション付きのサンプルをコンパイルしました:https://1drv.ms/i/s!ArNqKg0GFwIE0HVGDPPHvpEgaGrh。何か不足していますか? – MuhsinFatih

関連する問題