好的,我用 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/