0

コンパイラ: Microsoft Visual C++ 2010 Express、SP1 プロジェクト プロパティ: C/C++ Advance コンパイル形式: C コードとしてコンパイル (/TC)

メッセージ:

error C2099: initializer is not a constant

エラーを示す単純なテスト ケース:

typedef struct
{
    char *stringP;
    int  lino;
} foo_t;


#define bad {static foo_t foo ={__FILE__,__LINE__};}
#define good {static foo_t foo ={"filename",10};}

int main()
{

    bad;        // error C2099: initializer is not a constant
    good;       // no error

    return 0;
}

これにより、C2099エラーが発生します。このコードは gcc では正しくコンパイルおよびリンクされますが、Visual C++ 2010 Express では正しくリンクされません (C コードとしてコンパイル - つまり /TC オプション)。

4

3 に答える 3

0

何らかの理由で、Microsoft C コンパイラはプリプロセッサ マクロを定数として認識しない__LINE__ため (おそらく、行ごとに変更されるため?)、それを使用して構造体メンバーを初期化することはできません。

__LINE__前処理された .i ファイルを生成しても、実際には役に立ちません。これは、 が定数に置き換えられた後に正常にコンパイルされる正当なコードを生成するためです。どうやら、C コンパイラは、この同じ前処理された出力をコンパイルしようとしていません。

あなたは使用できるはずです

foo.lino = __LINE__;

後は問題なく。これは、Microsoft C コンパイラの不満のようです。私が使用した他の C コンパイラでは、__LINE__.

私が見つけた唯一の回避策は、ファイルを C++ コード (/Tp) としてコンパイルすることです。

于 2011-05-20T20:57:54.430 に答える
0

あなたのコードは私のシステム (MS Visual Studio 2005) でうまくコンパイルされます。

コードを前処理して、手動で問題を見つけることができます。

cl your_file.c /E > stuff.c

これにより、前処理されたファイルが生成されます (おそらく、さらに多くのコマンド ライン オプションを指定する必要があります。プロジェクトのプロパティ ページからコピーして貼り付けることができます)。

cl stuff.c

これで問題が再現するはずです。次にstuff.c;のコードを見てみましょう。問題がすぐに見つからない場合は、微調整してみてください (たとえば、複雑なものを 0 に置き換えるなど) - これは問題のヒントになるはずです。

(あなたのシステムは私のものよりもずっと新しいので、いくつかの詳細は異なるかもしれません。例えば、あなたのシステムのコンパイラは 以外のものと呼ばれているかもしれませんclが、アイデアはおそらくうまくいくでしょう)

于 2011-03-15T21:38:06.810 に答える