好的,我已经用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语句正在进行一些时髦的事情。我在某处做错了吗?
答案 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,或者您需要与那些人进行互操作,你必须坚持在块的顶部声明你的变量。