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

Dan*_*erg 3 c++ visual-studio c++20 c++-modules msvc14

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

typedef struct _MagickInfo
{
  char
    *name,
    *description,
    *version,
    *mime_type,
    *note,
    *module; /* offending member here */

  /* ... other members ... */
} MagickInfo;
Run Code Online (Sandbox Code Playgroud)

我可以告诉编译器不要在特定的#include中处理“模块”吗?

Bar*_*rry 6

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

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

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

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


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

  • 请注意,OP可能正在使用旧版本的编译器,其中“模块”是关键字。 (2认同)