【问题标题】:difference between extern "C" and simply extern [duplicate]extern“C”和简单的extern之间的区别[重复]
【发布时间】:2015-03-18 20:32:23
【问题描述】:

我看到 C/C++ 代码使用在函数签名中声明的 extern "C" 以及同时将 C 标头包含到 CPP 文件中。

但有些函数只是在其签名之前声明 extern(没有“C”)。

QN1:

这两种定义函数的方式是否具有相同的效果,或者它们意味着不同的东西?

对不起,如果我很傻,但我无法通过 Google 找到这种差异。

例如:

extern int someFunction( void *ret_val);

extern "C" int someFunction( void *ret_val);

QN2:

如果函数在其签名中使用 extern 声明,是否需要将相应的头文件包含在 extern "C" 块中?

正如 cmets 中的另一位用户所指出的,标记的重复项并不完全满足这里的问题。我正在编辑,以便将来其他人不会被误导到不同的问题。

【问题讨论】:

  • 似乎“重复”问题中的答案(几乎没有这个问题)描述了没有“C”的extern 的作用(或者它与extren "C" 的不同之处)。这是docs,这是关于它的stackoveflow faq。然后templates还有另一个用途。
  • @user2079303:如果您回答评论而不是评论,我会接受您的回答。非常感谢。
  • @MohamedIqzas 我无法回答,因为问题已经结束,很遗憾。

标签: c++ c extern-c


【解决方案1】:

extern "C" 禁用名称修改。它将允许您的 C++ 代码调用由 C 编译器编译的库中的函数

【讨论】:

    【解决方案2】:
    extern "C" int someFunction( void *ret_val);  
    

    将使someFunction 具有C 链接。

    【讨论】:

      【解决方案3】:

      extern "C" 在 C++ 文件中的存在是个人意图禁用 C++ 编译器对该文件中的函数执行的 name-mangling 转换。当没有名称修改时,客户端 C 代码可以调用这些函数。当您混合使用 C/C++ 代码并且需要跟踪特定于语言的功能时,就会执行此操作。以更令人讨厌的方式,C 链接在存在 Cpp 编译器的情况下变得兼容。

      代码可以是从变量/typedef 到完整函数/模块声明的任何内容。

      但如果你这样做:

      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 或更高版本),您可以非常轻松地完成这些工作。

      “extern”是一个链接关键字。您可以将它与“C”结合使用,以获得特定于编译器的链接指令。

      【讨论】:

      • @ha963ar:谢谢。 “这是隐式全局的、静态的”语句正确吗?我读到 extern 和 static 在 user2079303 在问题 cmets 中发布的链接中是不同的东西。
      • @MohamedIqzas 感谢您指出这一点。它绝对是隐含的全局(但不是静态的)。静态意味着函数/变量的范围与程序一样长。现在更正了我的答案:)
      • "extern "C" 仅表示可以使用 C 或 Cpp 编译器编译以下代码块。 - 错了。
      猜你喜欢
      • 1970-01-01
      • 2019-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-26
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多