【问题标题】:C++ "undefine" module keyword in include包含中的 C++“取消定义”模块关键字
【发布时间】:2019-12-08 17:04:30
【问题描述】:

我想在 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 中的“模块”吗?

【问题讨论】:

    标签: c++ visual-studio c++20 c++-modules msvc14


    【解决方案1】:

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

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

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

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


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

    【讨论】:

    • 请注意,OP 可能使用的是旧版本的编译器,其中 module 是关键字。
    • @NicolBolas 我认为确实如此。
    猜你喜欢
    • 2020-03-27
    • 2013-10-28
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 2019-10-29
    • 1970-01-01
    相关资源
    最近更新 更多