外部"C"和简单的外部之间的区别
difference between extern "C" and simply extern
我见过使用在函数签名中声明的外部"C"的C/C++代码,并且在将C标头包含在CPP文件中时也是如此。
但是有些函数只是在签名之前声明 extern(没有"C")。
问1:
这两种定义函数的方式是否具有相同的效果,或者它们意味着不同的东西?
对不起,如果我很傻,但我无法通过谷歌找到这种差异。
例如:
extern int someFunction( void *ret_val);
extern "C" int someFunction( void *ret_val);
问2:
如果一个函数的签名中有一个 extern,那么相应的头文件是否有必要包含在 extern "C" 块中?
正如另一位用户在评论中指出的那样,标记的重复并不能完全满足这里的问题。我正在编辑,以便将来其他人不会被误导到不同的问题。
extern "C" 禁用名称重整。它将允许您的C++代码调用由 C 编译器编译的库中的函数
extern "C" int someFunction( void *ret_val);
会让someFunction
有C联动。
C++文件中存在extern "C"
是禁用C++编译器对该文件中的函数执行的名称重整转换的个人意图。当没有名称重整时,客户端 C 代码可以调用这些函数。当您混合使用 C/C++ 代码并且需要跟踪特定于语言的功能时,会执行此操作。以更令人讨厌的方式,C 链接在 Cpp 编译器存在的情况下变得兼容。
代码可以是从变量/类型定义到完整函数/模块声明的任何内容。
但是,如果您这样做:
extern char c; // same goes true for extern int foo()
这意味着您说"我正在使用 char c,它在此文件外部有一个声明"。更像是在搜索路径中某个位置的另一个模块中。这是隐含的全球性的。在运行时,如果 c 发生更改,则更改会反映在任何地方。前提是您的编译器指令(如 -Iinclude_file_dirs -Ssource_file_dirs 等)已正确提供(在 GCC 或 g++ 上)。使用功能强大的 IDE(如 Visual Studio 2010 或更高版本),您可以非常轻松地完成这些操作。
"外部"是一个链接关键字。您可以将其与编译器特定链接指令的"C"结合使用。
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 类内部和外部静态 constexpr 元组之间的差异
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- Visual Studio 中静态库项目之间的未解析外部
- 匹配外部单引号之间的字符串
- 在没有外部文件的情况下在应用会话之间保存变量
- 无法将Android WebView渲染到C 和Java代码之间共享的外部纹理中
- 如果用像素来给出两条线(外部和内部)之间的边缘(外部和内部)之间的边缘,则如何计算(x,y)坐标
- 内部和外部过载C++运算符之间的差异
- 在内部和外部与调试器之间运行有什么区别
- dll和应用程序之间的C++外部使用
- 外部"C"和简单的外部之间的区别
- 相同的外部结构只有一个功能之间的区别
- decltype和隐藏外部名称的类成员名称之间的交互
- c++主外部函数之间的共享列表
- 在类之间共享向量时,无法解析的外部符号向量
- 我可以在两个OpenGL上下文之间共享外部纹理吗?
- 在类定义内部和外部定义成员函数之间有区别吗
- 函数之间的未解析外部