为什么';在visualstudio中正确编译tc代码?
在VisualStudio中尝试编译一些C代码时,我经常会遇到许多错误。出现此问题的原因是Visual Studio的C编译器只支持旧版本的C。如何快速修复所有C代码以与Visual Studio编译器兼容 例如,我正试图从中编译为什么';在visualstudio中正确编译tc代码?,c,visual-studio,visual-studio-2012,C,Visual Studio,Visual Studio 2012,在VisualStudio中尝试编译一些C代码时,我经常会遇到许多错误。出现此问题的原因是Visual Studio的C编译器只支持旧版本的C。如何快速修复所有C代码以与Visual Studio编译器兼容 例如,我正试图从中编译websocket.c和相关的头文件。关于“非法使用此类型作为表达式”我遇到了很多错误,根据其他答案,这表明我需要将变量声明移到每个块的开头。在Visual Studio中编译C的问题 VisualStudio不提供对ANSI C的完全支持。如果您希望C代码足够便携,
websocket.c
和相关的头文件。关于“非法使用此类型作为表达式”我遇到了很多错误,根据其他答案,这表明我需要将变量声明移到每个块的开头。在Visual Studio中编译C的问题
VisualStudio不提供对ANSI C的完全支持。如果您希望C代码足够便携,可以使用VisualStudio编译,那么您可能必须针对C89或将其编译为C++代码。第一个选项是不必要的限制,除非出于某种原因,您真的很喜欢89标准C,并且讨厌以后标准的所有新特性
编译为C++第二个选项,编译为C++,可以通过拨号器在HIS中提到,通过改变目标语言类型来实现。您可以通过右键单击源文件并选择属性,导航到C/C++->Advanced并将编译为选项更改为编译为C++代码来完成此操作
也可以使用命令行中的
为了解决这个问题,C++允许你指定特定的名称用“C”链接导出,这告诉编译器名称没有被篡改。这通常是通过在函数声明前加上
extern“C”
或将所有内容放在
extern "C" {
/* header contents here */
}
训练有素的C库开发人员知道这个问题,并将使用诸如宏之类的技术来解决它。一个常见的技术是检测用户何时编译为C++,并在头文件中声明的块的开始和结束处放置与这些相似的宏:。
#if defined (__cplusplus)
#define BEGIN_EXTERN_C extern "C" {
#define END_EXTERN_C }
#else
#define BEGIN_EXTERN_C
#define END_EXTERN_C
#endif
如果您使用的是成熟且编码良好的C库,那么头文件可能包含类似的内容。如果不是,您可能需要自己做(如果库是开源的,请将更改作为补丁提交!)
visualstudio中C语言的未来
2013年7月发布了一份声明,宣布Visual Studio 2013已经实现了大量C99功能。部分原因似乎是在一些C++标准的部分中提到了这些特性,所以无论如何它们都是必需的。新功能包括新的math.h
函数、新的inttypes.h
类型等。有关完整列表,请参阅帖子
A给出了以下花絮:
此外,一些C99核心语言功能将在2013 RTM中实现:
- C99_Bool
- C99复合文字
- C99指定初始值设定项
- C99变量声明
- 缺少tgmath.h标头。此标头需要C编译器支持。
- 注意,添加了ctgmath头,这是可能的,因为该头不需要tgmath.h头,只需要ccomplex和 cmath标题
- 缺少uchar.h标头。这是来自C Unicode TR
- printf系列中的多个格式说明符尚不受支持
- stdio.h和wchar.h中缺少snprintf和snwprintf函数
<代码> <代码>及其相关的编译器魔术是特殊的,我不知道我们的计划(正如柏氏POST解释的那样,C++有重载/模板,不需要C编译器魔术)。p>
你可以编译<代码> .c/c>文件作为C++代码。为此,右键单击解决方案中的文件并选择Properties,转到C/C++-Advanced-CompileAs。我不知道一次为项目中的所有文件设置此选项有多方便。编辑:无论如何,整个项目也存在此设置,所以只需执行相同的操作,但转到项目属性,而不是单个文件的属性。@dialer也许这是一个好的解决方案。我怀疑在不理解的情况下盲目地遵循此建议。如果原因真的很简单,如声明变量太晚,则错误消息可能是“在第一条指令后声明变量”或其某些变体。@MSalters此类错误的MSVC错误消息确实是
非法使用此类型作为表达式
,以及其他混乱的消息,如missing';'在“键入”之前
。但是,由于C不是C++的子集,所以我的解决方案在这种情况下可能不起作用,因此我只是把它贴在注释上。@拨号器:我不反对<代码>声明后声明= >错误< /代码>。我警告您,您不能反转语句以在语句后给出error=>声明
。可能还有其他原因,