【问题标题】:C referencing C++ externC 引用 C++ 外部
【发布时间】:2019-12-22 08:44:40
【问题描述】:

我在使用英特尔编译器的 Windows 编译中有一个头文件。标题看起来像这样:

#ifdef _MAIN
    Loggerp        logger;
#else
    extern Loggerp logger;
#endif

_MAIN 宏在 C++ 文件中定义,并且有一个包含标头的 C 文件。这会生成“...LNK2019: unresolved external symbol...”,因为 C++ 编译会修饰(破坏)“记录器”名称,使得链接器无法将未修饰的 C 名称与修饰的 C++ 名称匹配。

MSVC 文档声明 MS 编译器将同时支持“extern "C"' 和 'extern "C++"'。但是,英特尔编译器会将“extern”的引号标记为错误。

有人知道如何让英特尔编译器标记此引用,以便它可以链接到 C++ 和 C 吗?

【问题讨论】:

  • 这并没有解决问题,但是以下划线开头的名称后跟大写字母 (_MAIN) 和包含两个连续下划线的名称保留供实现使用。不要在你的代码中使用它们。
  • 谢谢,这是我的错,#define 不同,我只是删除了它的第一部分,最后留下了 _ 前缀。观察力还是不错的。
  • 您可能可以抽象出制造商。你是用 ICC 构建 C 部分,用 MSVS 构建 C++ 部分吗? (请注意,两者都可以)澄清额外的支持!
  • @LightnessRacesinOrbit 这两个部分都是使用 ICC 构建的。大多数对 logger 的引用来自 C++ 文件,只有一个来自 C 文件。我提到 MSVC 是因为我认为 MSVC 'extern "C++"' 可能是一个好方法,但似乎 ICC 不支持它。
  • 听起来你认为extern "C++" 是一个 MSVC 的东西。它不是。它是 C++ 的一部分。如果您不使用它,您可能希望从您的问题中删除对 Visual Studio 的引用。 FWIW 我在其他地方没有看到 ICC 在这方面不合规的证据。 minimal reproducible example 将是一个好的开始。

标签: c++ c windows extern icc


【解决方案1】:
// when compiling C++ code, use the non-mangled C names
#ifdef __cplusplus
# define EXTERN extern "C"
#else
# define EXTERN extern 
#endif

EXTERN Loggerp logger;

【讨论】:

  • 我最喜欢的 nits 之一:使用 C-mangled 名称。 C 编译器也会混淆名称,通常是在前面加上下划线。我多年前使用的一个编译器附加了一个下划线。
  • 这让我走上了正轨。存在先有鸡还是先有蛋的问题,因此在定义 _MAIN 时也定义了 __cplusplus。将该部分移出 #if _MAIN 并使用您描述的代码允许编译继续进行。
猜你喜欢
  • 2017-03-16
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
相关资源
最近更新 更多