0

わかりました、私はしばらくの間 C++ でプログラミングをしており、友人が C で行う割り当てを手伝おうとしています。C++ とは異なるいくつかのことを C で行う方法を見た後、私は友人が何かをコンソールに出力し、ユーザーの入力を読み取る簡単なプログラムを作成するのを手伝ってください。次のコードがあります。

#include <stdlib.h>
#include <stdio.h>

#define  WIN32_LEAN_AND_MEAN
#include <Windows.h>

int main(int argc, char* argv[])
{
    char str1[] = "Please enter your name.";
    printf(str1); // This appears to be the nuisance line.

    char buffer[64];
    fgets(buffer, 64, stdin);

    printf("Your name is %s", buffer);   
    Sleep(5000);
    return 0;
}

さて、ここで奇妙なことがあります。これをコンパイルしようとすると、コンソールに次のエラーが表示されます。

1>c:\users\nkosi\documents\visual studio 2012\projects\c++\credit2\credit2\main.c(12): error C2143: syntax error : missing ';' before 'type'
1>c:\users\nkosi\documents\visual studio 2012\projects\c++\credit2\credit2\main.c(13): error C2065: 'buffer' : undeclared identifier
1>c:\users\nkosi\documents\visual studio 2012\projects\c++\credit2\credit2\main.c(13): warning C4047: 'function' : 'char *' differs in levels of indirection from 'int'
1>c:\users\nkosi\documents\visual studio 2012\projects\c++\credit2\credit2\main.c(13): warning C4024: 'fgets' : different types for formal and actual parameter 1
1>c:\users\nkosi\documents\visual studio 2012\projects\c++\credit2\credit2\main.c(15): error C2065: 'buffer' : undeclared identifier

ただし、printf ステートメントの下のすべてのコードを削除すると、プログラムは完全にコンパイルおよび実行されます。printf ステートメントを削除すると、プログラムは完全にコンパイルおよび実行されます。このエラーがいかに奇妙であるかを確認するために、コードを次のように変更して、コンパイルするとどうなるかを確認しました。

int main(int argc, char* argv[])
{
    char str1[] = "Please enter your name.";
    printf(str1); // This appears to be the nuisance line.

    int x = 5;

    return 0;
}

これをコンパイルすると、次のエラーが発生します...

1>c:\users\nkosi\documents\visual studio 2012\projects\c++\credit2\credit2\main.c(12): error C2143: syntax error : missing ';' before 'type'

printf を使用する他の人の C プログラムを調べることにしましたが、何も悪いことをしているようには見えません。私は Visual Studio 2012 を使用していますが、ここに問題があると思います。私は C を使用しないかもしれませんが、元のコードが完全に有効な C++ コード (私は C++ コードとしてコンパイルし、コンパイルして正常に実行されました) であり、完全に有効な C コードであるように見えます。その printf ステートメントで何かおかしなことが起こっています。私はどこかで何か間違ったことをしていますか?

4

1 に答える 1

7

問題はprintfありません。12.0 より前のバージョンの MSVC (別名 "Visual Studio 2013") では、ステートメントの前に、ブロックの上部で C89 スタイルの変数を宣言する必要があります。 (C は C++ ではありません)。 例えば:

int main(int argc, char* argv[])
{
    char str1[] = "Please enter your name.";
    char buffer[64];

    printf(str1);

    fgets(buffer, 64, stdin);

    printf("Your name is %s", buffer);   
    Sleep(5000);
    return 0;
}

これはどのブロックでも実行できることに注意してください。関数の先頭である必要はありません。関数の先頭ですべての変数を宣言するのが特に面倒な場合は、新しいブロック全体に魔法のブレースを振りかけることができます。

int main(int argc, char* argv[])
{
    char str1[] = "Please enter your name.";
    printf(str1);

    {
        /* This block is unnecessary, but allows us to declare buffer here */
        char buffer[64];
        fgets(buffer, 64, stdin);

        printf("Your name is %s", buffer);   
    }

    Sleep(5000);
    return 0;
}

これはあなたが嫌い​​なケースになるかもしれませんが。(私にとっては、ほとんどの場合、それらを関数の先頭に置く方がそれほどひどいものではありません。)

ありがたいことに、MSVC 12.0 以降、Microsoft コンパイラ チームは C コンパイラに新たな投資を行っており、結局 C99 を実装する価値があると考えています。以前の決定とは対照的に、これは素晴らしい新しい開発です。

したがって、MSVC 12.0 以降では、変数のインライン宣言がサポートされています。 ただし、以前のバージョンの MSVC または Visual Studio に行き詰まっている場合、または以前のバージョンと相互運用する必要がある場合は、ブロックの先頭で変数を宣言することに固執する必要があります。

于 2013-10-31T14:45:02.857 に答える