Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';在visualstudio中正确编译tc代码?_C_Visual Studio_Visual Studio 2012 - Fatal编程技术网

为什么';在visualstudio中正确编译tc代码?

为什么';在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代码足够便携,

在VisualStudio中尝试编译一些C代码时,我经常会遇到许多错误。出现此问题的原因是Visual Studio的C编译器只支持旧版本的C。如何快速修复所有C代码以与Visual Studio编译器兼容

例如,我正试图从中编译
websocket.c
和相关的头文件。关于“非法使用此类型作为表达式”我遇到了很多错误,根据其他答案,这表明我需要将变量声明移到每个块的开头。

在Visual Studio中编译C的问题

VisualStudio不提供对ANSI C的完全支持。如果您希望C代码足够便携,可以使用VisualStudio编译,那么您可能必须针对C89或将其编译为C++代码。第一个选项是不必要的限制,除非出于某种原因,您真的很喜欢89标准C,并且讨厌以后标准的所有新特性

编译为C++

第二个选项,编译为C++,可以通过拨号器在HIS中提到,通过改变目标语言类型来实现。您可以通过右键单击源文件并选择属性,导航到C/C++->Advanced并将编译为选项更改为编译为C++代码来完成此操作

也可以使用命令行中的/tp>代码> C++,或者使用<代码> /tp>代码>开关编译所有的东西作为C++ +/p> 链接问题 如果您正在链接到用C编写的库,上述修复程序可能会导致链接失败。这是因为,现在你编译C文件作为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函数
尽管您可以期待他们在未来:

我们并不讨厌snprintf()(恰恰相反),我们只是错过了它,时间不够了

请注意,与标准库无关的其他语言功能仍然不可用

看起来标准C在未来将获得更多的支持,尽管可能只是因为支持C++11和C++14需要实现更现代的功能

<代码> <代码>及其相关的编译器魔术是特殊的,我不知道我们的计划(正如柏氏POST解释的那样,C++有重载/模板,不需要C编译器魔术)。p>


你可以编译<代码> .c/c>文件作为C++代码。为此,右键单击解决方案中的文件并选择Properties,转到C/C++-Advanced-CompileAs。我不知道一次为项目中的所有文件设置此选项有多方便。编辑:无论如何,整个项目也存在此设置,所以只需执行相同的操作,但转到项目属性,而不是单个文件的属性。@dialer也许这是一个好的解决方案。我怀疑在不理解的情况下盲目地遵循此建议。如果原因真的很简单,如声明变量太晚,则错误消息可能是“在第一条指令后声明变量”或其某些变体。@MSalters此类错误的MSVC错误消息确实是
非法使用此类型作为表达式
,以及其他混乱的消息,如
missing';'在“键入”之前
。但是,由于C不是C++的子集,所以我的解决方案在这种情况下可能不起作用,因此我只是把它贴在注释上。@拨号器:我不反对<代码>声明后声明= >错误< /代码>。我警告您,您不能反转语句以在语句后给出
error=>声明
。可能还有其他原因,