Visual Studio 2015:Extern "C" 和 "export" 关键字
Visual Studio 2015: Extern "C" and the "export" keyword
我正在将一个大型项目从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;
}
相关文章:
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- C++中的"inline"关键字
- 如何确保C++函数在定义之前声明(如override关键字)
- 谷歌模拟和覆盖关键字
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 为什么"delete"关键字不删除节点?
- 在 c++ 中正确定义"this"关键字?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- C++ - 为什么这里需要'template'关键字?
- C++函数的关键字?
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- "friend"关键字在C++中是什么意思?
- 声明C++数组(带或不带 "new" 关键字)
- 对齐和对齐的实际用例C++关键字
- 在 c++ 中三元运算符中不允许继续(关键字)吗?
- 考虑到其他好处,关键字'auto'真的有助于简化调试C++吗?
- 在 Objective-C++ -> EXC_BAD_ACCESS Error 中使用"new"关键字