C++ "undefine" include 中的模块关键字
C++ "undefine" module keyword in include
我想在 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" 吗?
module
不是关键字(您可以在 [lex.key] 中找到关键字列表并确认它不存在)。
相反,它是 "identifier with special meaning" ([lex.name]/2),通常称为 上下文相关关键字。
也就是说,只有某些地方打算使用 module
"keyword",因为模块声明不可能出现在所有地方。只有那些特定的地方才会被视为模块声明。有关编译器如何消除歧义的更详尽的处理,请参阅 P0924.
使 module
(和 import
)上下文敏感的动机之一是 module
实际上是代码中相当常用的标识符 - 不仅仅是 Magick++,还有还有 Vulkan.
简而言之,您拥有一个包含名为 module
的成员的类型这一事实不会造成问题。将 type 命名为 module
更糟(如果您有该类型的全局变量,则更糟 - 这可能会导致问题,但至少可以重写您的代码以消除在这些情况下使用 module
的歧义。
我想在 visual studio 中使用 C++20 模块,但我的一个项目使用 Magick++,它定义了一个 struct
和一个成员 char*
在 "magick++.h":
typedef struct _MagickInfo { char *name, *description, *version, *mime_type, *note, *module; /* offending member here */ /* ... other members ... */ } MagickInfo;
我可以告诉编译器不要在那个特定的#include 中处理 "module" 吗?
module
不是关键字(您可以在 [lex.key] 中找到关键字列表并确认它不存在)。
相反,它是 "identifier with special meaning" ([lex.name]/2),通常称为 上下文相关关键字。
也就是说,只有某些地方打算使用 module
"keyword",因为模块声明不可能出现在所有地方。只有那些特定的地方才会被视为模块声明。有关编译器如何消除歧义的更详尽的处理,请参阅 P0924.
使 module
(和 import
)上下文敏感的动机之一是 module
实际上是代码中相当常用的标识符 - 不仅仅是 Magick++,还有还有 Vulkan.
简而言之,您拥有一个包含名为 module
的成员的类型这一事实不会造成问题。将 type 命名为 module
更糟(如果您有该类型的全局变量,则更糟 - 这可能会导致问题,但至少可以重写您的代码以消除在这些情况下使用 module
的歧义。