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 开始,微软编译器团队对他们的 C 编译器进行了新的投资,并相信 C99 可能值得实施。与之前的决定相比,这是一个了不起的新发展。

因此,从 MSVC 12.0 开始,支持变量的内联声明! 但是,如果您停留在以前版本的 MSVC 或 Visual Studio 上,或者如果您需要与这些版本进行互操作,您将不得不坚持在块的顶部声明您的变量。

于 2013-10-31T14:45:02.857 回答