5

Visual Studio を使い始めたばかりで (dreamspark から VS 2012 を入手しましたが、Windows を再び使い始めてからしばらく経ちません)、問題が発生しています。

ソースファイルフォルダーの下に、次のような「main.c」という名前の単一のファイルがあります。

#include <stdio.h>

typedef struct S_s S;
struct S_s {
    void* x;
};

int main(int argc, char** argv)
{
    int N;
    scanf("%d", &N);

    S* s;
    printf("%p", s);

    return 0;
}

ビルドしようとすると、次のエラーメッセージが表示されます。

Error   3   error C2065: 's' : undeclared identifier    c:\users\math4tots\documents\visual studio 2012\projects\algorithms\lecture1\main.c 13  1   Lecture1
Error   4   error C2065: 's' : undeclared identifier    c:\users\math4tots\documents\visual studio 2012\projects\algorithms\lecture1\main.c 14  1   Lecture1
Error   2   error C2275: 'S' : illegal use of this type as an expression    c:\users\math4tots\documents\visual studio 2012\projects\algorithms\lecture1\main.c 13  1   Lecture1

面白いことに、この行をコメントアウトすると問題なくビルドできますscanf

「Visual C++」オプションで「空のプロジェクト」を作成したため、VSがそれをCまたはC++プログラムとしてコンパイルしたかどうかわかりませんでした。ただし、私のコードは C/C++ に依存しないので、C または C++ でコンパイルする必要があるという印象を受けました。

プログラムのセマンティクスを維持しながらこれをビルドするにはどうすればよいですか?

4

2 に答える 2

15

コードは正当な C++ および正当な C99 ですが、正当な C89 ではありません。C89 での変数宣言はブロックの先頭に来る必要があるため、C89 ではS* s;後を付けることscanf("%d", &N); はできません。

于 2012-08-28T18:43:13.267 に答える
5

試したことはありませんが、古い C ルール (C99 より前) では、ブロックの先頭でのみ auto 変数の宣言が許可されていました。したがって、これらの規則の下では、介入scanfにより宣言がS* s違法になります。scanf問題の「修正」をコメントアウトします。これは、C++ では常に有効です。

于 2012-08-28T18:43:29.523 に答える