C printf会在其下面的所有行上导致错误

时间:2013-10-31 14:41:58

标签: c visual-studio-2012

好的,我已经用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语句正在进行一些时髦的事情。我在某处做错了吗?

1 个答案:

答案 0 :(得分:7)

printf不是问题。 12.0之前的MSVC版本(又名&#34; Visual Studio 2013&#34;)要求您在任何语句之前在块的顶部声明变量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可能值得实施。与previous decisions相反,这是一个很棒的新发展。

因此,从MSVC 12.0开始,支持内联变量声明!但是,如果您遇到以前版本的MSVC或Visual Studio,或者您需要与那些人进行互操作,你必须坚持在块的顶部声明你的变量。