预处理:为 `import` 定义 shorthand 合法吗?
Preprocessing: Is defining a shorthand for `import` legal?
为了解决代码高尔夫挑战,我想生成尽可能小的代码。我想为 import
:
定义一个 shorthand
#define I import
I<vector>;
当然,这里的用意是重用I
来实际节省字节。
这在 C++20 中合法吗?
想法/到目前为止我发现了什么:
- 根据 cppreference,"The module and import directives are also preprocessing directives"。所以我认为这可以归结为一个问题:我们是否可以保证预处理器首先必须用我们的定义替换 I?
- 我认为处理
import
指令应该发生在翻译阶段 4,并且对于整个阶段,除非另有说明 ([cpp.pre]-7),否则 I
不应该被宏扩展。这种情况是否另有规定?
- 这是否可以作为 preprocessor rescan 的一部分?
- godbolt 上的 Clang 和 GCC 无法编译,但据我所知,它们还不支持在没有额外步骤的情况下导入标准库头文件,并且它们在 shorthand 版本中给出了相同的错误消息,这表明它会工作(?)
- 相同的方法,但使用
include
而不是 import
,不适用于 gcc 和 clang,因此可能不合法。
没有
A preprocessing directive consists of a sequence of preprocessing
tokens that satisfies the following constraints: At the start of
translation phase 4, the first token in the sequence, referred to as a
directive-introducing token, begins with the first character in the
source file (optionally after whitespace containing no new-line
characters) or follows whitespace containing at least one new-line
character, and is [...]
预处理指令是在翻译阶段 4 开始时确定的,在任何宏替换之前。因此,I<vector>;
不被识别为指令,I
的宏扩展中的 import
在翻译阶段 7 中不是 replaced by the import-keyword token. This in turn means that it is not recognized as a module-import-declaration,而只是一个错误的 - formed 尝试在没有预先声明的情况下使用标识符 import
。
这个舞蹈的目的是确保构建系统可以知道文件的依赖关系,而不必完全预处理文件 - 如果可以从宏替换中形成导入,则需要这样做。
为了解决代码高尔夫挑战,我想生成尽可能小的代码。我想为 import
:
#define I import
I<vector>;
当然,这里的用意是重用I
来实际节省字节。
这在 C++20 中合法吗?
想法/到目前为止我发现了什么:
- 根据 cppreference,"The module and import directives are also preprocessing directives"。所以我认为这可以归结为一个问题:我们是否可以保证预处理器首先必须用我们的定义替换 I?
- 我认为处理
import
指令应该发生在翻译阶段 4,并且对于整个阶段,除非另有说明 ([cpp.pre]-7),否则I
不应该被宏扩展。这种情况是否另有规定? - 这是否可以作为 preprocessor rescan 的一部分?
- godbolt 上的 Clang 和 GCC 无法编译,但据我所知,它们还不支持在没有额外步骤的情况下导入标准库头文件,并且它们在 shorthand 版本中给出了相同的错误消息,这表明它会工作(?)
- 相同的方法,但使用
include
而不是import
,不适用于 gcc 和 clang,因此可能不合法。
没有
A preprocessing directive consists of a sequence of preprocessing tokens that satisfies the following constraints: At the start of translation phase 4, the first token in the sequence, referred to as a directive-introducing token, begins with the first character in the source file (optionally after whitespace containing no new-line characters) or follows whitespace containing at least one new-line character, and is [...]
预处理指令是在翻译阶段 4 开始时确定的,在任何宏替换之前。因此,I<vector>;
不被识别为指令,I
的宏扩展中的 import
在翻译阶段 7 中不是 replaced by the import-keyword token. This in turn means that it is not recognized as a module-import-declaration,而只是一个错误的 - formed 尝试在没有预先声明的情况下使用标识符 import
。
这个舞蹈的目的是确保构建系统可以知道文件的依赖关系,而不必完全预处理文件 - 如果可以从宏替换中形成导入,则需要这样做。