Nko*_*ean 0 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;
}
Run Code Online (Sandbox Code Playgroud)
好的,现在这里是奇怪的事情.尝试编译时,我在控制台中收到以下错误.
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
Run Code Online (Sandbox Code Playgroud)
但是,如果我删除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;
}
Run Code Online (Sandbox Code Playgroud)
编译时我收到以下错误...
1>c:\users\nkosi\documents\visual studio 2012\projects\c++\credit2\credit2\main.c(12): error C2143: syntax error : missing ';' before 'type'
Run Code Online (Sandbox Code Playgroud)
我决定查看使用printf的其他人的C程序,看起来我什么都没做错.我正在使用Visual Studio 2012,我认为这是问题所在.我可能不会使用C,但我知道原始代码是完全有效的C++代码(我将其编译为C++代码并且编译并运行良好),它似乎是完全有效的C代码.这个printf语句正在进行一些时髦的事情.我在某处做错了吗?
这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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,您可以在任何块中执行此操作,它不必是函数的开头.如果在函数顶部声明每个变量对你来说特别讨厌,你可以为新块添加魔术括号:
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;
}
Run Code Online (Sandbox Code Playgroud)
虽然这可能成为你讨厌的情况.(对我来说,将它们放在函数的顶部几乎总是不那么糟糕.)
值得庆幸的是,从MSVC 12.0开始,Microsoft编译器团队已对其C编译器进行了新的投资,并认为C99可能值得实施.与以前的决定相比,这是一个很好的新发展.
因此,从MSVC 12.0开始,支持变量的内联声明! 但是,如果您遇到以前版本的MSVC或Visual Studio,或者您需要与那些人进行互操作,则必须坚持在块的顶部声明变量.