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

标签 c visual-studio-2012

好的,我用 C++ 编程已经有一段时间了,我正试图帮助一个 friend 完成他用 C 完成的作业。在了解了如何用 C 完成一些与 C++ 不同的事情之后,我开始帮助我的 friend 制作一个简单的程序,该程序将向控制台打印一些内容,然后读取用户输入的内容。我们有以下代码:

#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 语句发生了一些奇怪的事情。我是不是哪里做错了什么?

最佳答案

printf 不是问题所在。 12.0 之前的 MSVC 版本(又名“Visual Studio 2013”​​)要求您在 block 的顶部、任何语句之前声明变量 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;
}

请注意,您可以在任何 block 中执行此操作,它不必是函数的开头。如果在函数顶部声明每个变量对您来说特别令人厌恶,您可以在整个新 block 中使用魔法括号:

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,或者如果您需要与这些版本进行互操作,您将不得不坚持在 block 的顶部声明您的变量。

关于C printf 在它下面的所有行上导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19709511/

相关文章:

c++ - Microsoft Visual Studio Express 2012 不会运行单个程序

c++ - Visual Studio 吐出 .lib 而不是 .dll

c - 字符串数组 : Segmentation fault(core dumped)

c++ - 在 Visual Studio 中通过 printf() 打印 std::string

c++ - GetCPUDescriptorHandleForHeapStart 堆栈损坏

c - 测试 token 结束

c++ - MultiByteToWideChar 终止带有垃圾的输出缓冲区,但未报告任何错误。为什么?

nuget - 如何删除解决方案中任何项目未引用的 NuGet 包?

调用约定错误 - C

c - <puts@plt> 到底是什么意思?