我想在Visual Studio中使用C ++ 20模块,但是我的一个项目使用Magick++定义了一个struct
,其中一个成员char*
名为“ module” “ magick ++。h”:
typedef struct _MagickInfo { char *name, *description, *version, *mime_type, *note, *module; /* offending member here */ /* ... other members ... */ } MagickInfo;
我可以告诉编译器不要在特定的#include中处理“模块”吗?
答案 0 :(得分:6)
module
不是关键字(您可以在[lex.key]中找到关键字列表并验证其是否存在)。
相反,它是一个“具有特殊含义的标识符”([lex.name]/2),通常称为上下文相关关键字。
也就是说,由于模块声明不能在所有地方出现,因此仅在某些特定地方打算使用module
“关键字”。只有那些特定的地方才被视为模块声明。有关编译器如何进行歧义消除的更彻底的处理,请参见P0924。
使module
(和import
)与上下文相关的动机之一是,module
实际上是代码中相当普遍使用的标识符-不只是Magick ++,还有{ {3}}。
简而言之,您的类型具有名为module
的成员这一事实不会引起问题。名为module
的 type 会更糟(更糟糕的是,如果您具有该类型的全局变量-可能会导致问题,但是至少可以用这种方式重写代码)消除在这种情况下使用module
的方式。