全局模块片段和 `extern "C++"` 块之间有区别吗?

编程语言 2026-07-11

当模块需要包含头文件时,通常如下情况不起作用,因为头文件的内容会被附加到模块: (与函数名 被改名以包含模块名 等)

export module A;
#include <iostream> // Wrong

包含在全局模块片段中确实可行,因为它把头文件的内容附加到全局模块:

module;
#include <iostream>
export module A;

在一个 extern "C++" 块中包含也似乎可行:

export module A;
extern "C++"
{
    #include <iostream>
}

有些编译器会对后者发出警告,但这似乎是对包含的一般性警告,未能在包含之前检查 extern "C++"

这两段中的最后一个片段之间有区别吗?除了警告之外,是否有理由偏好其中一个?

(注,我标记 c++20 因为这是引入模块的版本。如果对更新的标准答案不同,我想要最新标准的答案,而不是C++20。)

解决方案

当然,你应该偏好真正的全局模块片段,而不是对其的伪实现,原因有以下几点:

  1. #include 可能会被转换成 import,它必须在 module 声明之后立即出现(否则就会出现在全局模块片段中)。
  2. 如果一个 #include 未被如此转换,所包含的文件可能会包含一个 import,从而受到这样的限制。
  3. 全局模块片段中的声明只有在直接使用时才会被丢弃,因此它们在编译后的模块接口中不需要占用空间,也不需要进口方花时间来导入。(显然你可能想提供更多接口的访问,但那会涉及会阻止丢弃的 export using 声明。)
  4. 构建系统会尝试优化对模块文件的依赖扫描,后续的 #include 将会削弱这一点。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章