Visual Studio 2015:Extern "C" 和 "export" 关键字

Visual Studio 2015: Extern "C" and the "export" keyword

本文关键字:export 关键字 Extern Studio 2015 Visual      更新时间:2023-10-16

我正在将一个大型项目从VS2012迁移到VS2015(我知道这是一个小步骤(,我遇到了一个问题,即C头不再编译,在保留的C++关键字上出错,即使它们包含在extern C.中

下面是一个简化的例子(2012年编译,但不是2015年(

main.cpp

extern "C" {
#include "cheader.h"
}
int main()
{
printfFromC();
return 0;
}

cheader.h

#ifndef HEADER_H
#define HEADER_H
extern int export;
int printfFromC();
#endif

ctest.c

#include "cheader.h"
#include <stdio.h>
int export = 0;
int printfFromC()
{
export++;
return printf("Hello from C (invocation %d) !n", export);
}

出现以下错误:

------ Build started: Project: ConsoleApplication1, Configuration: Debug Win32 ------
main.cpp
c:[...]cheader.h(4): warning C4091: 'extern ': ignored on left of 'int' when no variable is declared
c:[...]cheader.h(4): error C2143: syntax error: missing ';' before 'export'
c:[...]cheader.h(4): error C3378: a declaration can be exported only from a module interface unit

编辑:

我在创建示例时犯了一个错误——导致问题的关键字是export——而不是我最初认为的任何c++保留关键字。以下示例已修改为使用int export而不是int new

extern "C"的使用控制了它所应用的代码的名称篡改-它不会神奇地使编译器将该代码编译为C。因此,当您在main.cpp#include包含extern int export;的标头时,它被编译为C++代码,并且由于export是C++中的保留字,因此会出现语法错误。

new是C++中的一个关键字。在交叉编译的代码中不能将其用作标识符。这就是错误的原因。您必须为变量想出一个不同的名称。

请注意,将C++翻译单元的一部分放入extern "C" { ... }区域并不意味着该代码将以某种方式编译为C代码。这只是意味着该地区的外部实体将获得C链接。代码本身仍然编译为C++代码,并且所有特定于C++的限制仍然适用。

进一步挖掘,这里建议的破解似乎有效:https://stackoverflow.com/a/36869181/1486100

通过以下方式更改main.cpp可以进行编译。

extern "C" {
#include "cheader.h"
}
int main()
{
printfFromC();
return 0;
}

extern "C" {
#define export extern_export
#include "cheader.h"
#undef export
}
int main()
{
printfFromC();
return 0;
}