预处理:为 `import` 定义 shorthand 合法吗?

Preprocessing: Is defining a shorthand for `import` legal?

为了解决代码高尔夫挑战,我想生成尽可能小的代码。我想为 import:

定义一个 shorthand
#define I import
I<vector>;

short godbolt example

当然,这里的用意是重用I来实际节省字节。

这在 C++20 中合法吗?

想法/到目前为止我发现了什么:

没有

[cpp.pre]/1:

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

这个舞蹈的目的是确保构建系统可以知道文件的依赖关系,而不必完全预处理文件 - 如果可以从宏替换中形成导入,则需要这样做。