全局模块片段和 `extern "C++"` 块之间有区别吗?
当模块需要包含头文件时,通常如下情况不起作用,因为头文件的内容会被附加到模块: (与函数名 被改名以包含模块名 等)
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。)
解决方案
当然,你应该偏好真正的全局模块片段,而不是对其的伪实现,原因有以下几点:
#include可能会被转换成import,它必须在module声明之后立即出现(否则就会出现在全局模块片段中)。- 如果一个
#include未被如此转换,所包含的文件可能会包含一个import,从而受到这样的限制。 - 全局模块片段中的声明只有在直接使用时才会被丢弃,因此它们在编译后的模块接口中不需要占用空间,也不需要进口方花时间来导入。(显然你可能想提供更多接口的访问,但那会涉及会阻止丢弃的
export using声明。) - 构建系统会尝试优化对模块文件的依赖扫描,后续的
#include将会削弱这一点。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。