2

私はZedShawの「LearnCtheHardWay」オンラインコースをフォローしようとしています。Visual Studio 2010でcコンパイラを使用してex17をコンパイルしようとすると、問題が発生しました。コードの100行目あたりから常にエラーが発生します。ただし、Ubuntu仮想マシンを使用しているときにまったく同じファイルをコンパイルしようとすると、コードは正常にコンパイルされます。エラーは、コンパイラが「。」でエラーを生成する「{.id」で次のコードで生成されます。このエラーが1つのコンパイラで発生し、別のコンパイラでは発生しない理由を誰かが説明できますか?これはWindows環境で発生するため、将来どのように回避できますか?

void Database_create(struct Connection *conn)
{
int i = 0;

for( i = 0; i < MAX_ROWS; i++) {
    // Make Prototype to initialize
    struct Address addr = {.id = i, .set = 0}; //Syntax error generated here
    // then assign it
    conn->db->rows[i] = addr;
        }
 }

注:これは、Cコンパイラスイッチがアクティブ化されているかどうかに関係なく、VisualStudioのコマンドプロンプトで発生します。

4

1 に答える 1

1

struct Address addr = {.id = i, .set = 0};C99 コンストラクトです。具体的には、{.id = i, .set = 0}イニシャライザは「指定されたイニシャライザ」です。

一般に、MS VC++ は C99 コンストラクトをサポートしていません。C++ ではいくつかの一般的な C99 機能 (ブロック内のステートメントの後に許可される宣言など) がサポートされているため、場合によっては、C++ としてコンパイルすることでこれを回避できます。ただし、指定された初期化子は C++ の一部でもありません。

Windows で C99 をサポートするコンパイラ (MinGW の GCC など) を使用するか、C90 と互換性があるようにコードを変更する必要があります。C99 固有のものがあまりない場合、それはおそらくそれほど難しくありません。

struct Address addr = {0};
addr.id = i;
于 2013-02-15T00:17:45.990 に答える