4

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

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

  /* ... other members ... */
} MagickInfo;

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

4

1 回答 1

7

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

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

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

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


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

于 2019-07-31T12:31:19.113 回答