【问题标题】:does g++ with extern "C" really gives the same environment as gcc does?带有 extern "C" 的 g++ 真的提供与 gcc 相同的环境吗?
【发布时间】:2017-07-28 00:29:05
【问题描述】:

我正在使用其他 C 语言包和一些 C++ 语言包编写代码。所以我的代码需要使用 C 例程和 C++ 类。我的计划是,使用extern "C" {} 方法将所有头文件包含在C 中,并使用g++ 进行编译。
因此,我将 C 中的所有页眉复制到一个目录并添加页眉和页脚,例如,

#ifdef __cplusplus  
extern "C" {  
#endif  
//...
#ifdef __cplusplus  
}  
#endif  

但是,它仍然无法编译。所以我制作了一个模拟 C 程序,以使其看起来清楚问题是如何出现的。

main.C

#include <stdio.h>
#include <A.h> //This is the problematic header file.
int main()
{
  struct MMM m; //some struct in A.h
  printf("How many times do I have to compile this? %d\n",1000);
  return 0;
}

啊.h

#ifndef _A_H
#define _A_H

#ifndef ...
#define ... ...
#endif

#include <B.h>
#include <C.h> 
#endif

它在编译模拟程序时给我的错误消息与在编译我正在处理的真实代码期间的错误消息相同。它是关于在 B.h 和 C.h 中定义的一些预处理器宏函数。但我想向您保证,所有这些头文件都写在 extern "C" {} 中。模拟程序仅用 C 语言编写,因此我能够使用 gcc 检查没有错误消息,并且效果很好。
所以我想知道的是,带有 extern "C" 的 g++ 不是和 gcc 一样工作吗?还是我错过了什么?有什么建议可以解决这个问题吗?

【问题讨论】:

  • 如果不查看产生错误的代码就很难判断。 C 代码通常可以由 C++ 编译器按原样编译,但也有一些例外。

标签: gcc g++ extern


【解决方案1】:

extern "C" 不会将 C++ 编译器转换为 C 编译器。代码仍然必须是有效的 C++ 代码。它不能使用新的关键字作为标识符,没有从void * 到其他指针类型的隐式转换,等等。 extern "C" 只影响链接(基本上,代码如何与其他翻译单元交互)。它不会改变编译器接受的源语言。​​

【讨论】:

    猜你喜欢
    • 2014-02-18
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多