C++ 包含中的"未定义"模块关键字

C++ "undefine" module keyword in include

本文关键字:模块 关键字 未定义 C++ 包含中      更新时间:2023-10-16

我想在Visual Studio中使用C++20模块,但我的一个项目使用Magick++,它定义了一个struct,其中的成员char*"magick++.h"中名为"module":

typedef struct _MagickInfo
{
char
*name,
*description,
*version,
*mime_type,
*note,
*module; /* offending member here */
/* ... other members ... */
} MagickInfo;

我可以告诉编译器不处理该特定 #include 中的"模块"吗?

module

不是关键字(您可以在 [lex.key] 中找到关键字列表并验证它不存在)。

相反,它是一个"具有特殊含义的标识符"([lex.name]/2),通常称为上下文相关关键字

也就是说,只有某些地方打算使用module"关键字",因为模块声明不能出现在任何地方。只有那些特定的地方才会被视为模块声明。有关编译器如何进行此消除歧义的更全面处理,请参阅 P0924。

使module(和import)上下文敏感的动机之一是module实际上是代码中相当常用的标识符 - 它不仅仅是Magick++,还有Vulkan。


简而言之,您有一个名为module的成员的类型这一事实不会引起问题。拥有一个名为module的类型会更糟(如果您拥有该类型的全局变量,则更糟 - 这可能会导致问题,但至少可以重写代码以消除在这些情况下使用module的歧义)。