C++ 预处理:定义“导入”的缩写合法吗?
为了解决代码高尔夫挑战,我希望生成尽可能最小的代码。我想到了为导入定义一个速记:C++ 预处理:定义“导入”的缩写合法吗?,c++,language-lawyer,c-preprocessor,c++20,C++,Language Lawyer,C Preprocessor,C++20,为了解决代码高尔夫挑战,我希望生成尽可能最小的代码。我想到了为导入定义一个速记: #define I import I<vector>; #定义我导入 我 当然,这里的意图是重用I来实际保存字节 这在C++20中合法吗 想法/我目前发现的情况: 根据参考资料。所以我认为这可以归结为一个问题,我们是否保证预处理器首先必须用我们的定义替换I 我认为处理import指令应该发生在翻译阶段4,对于整个阶段,I不应该进行宏扩展,除非另有规定()。对于这种情况是否另有规定 这是否可能作为
#define I import
I<vector>;
#定义我导入
我
当然,这里的意图是重用I
来实际保存字节
这在C++20中合法吗
想法/我目前发现的情况:
- 根据参考资料。所以我认为这可以归结为一个问题,我们是否保证预处理器首先必须用我们的定义替换I
- 我认为处理
指令应该发生在翻译阶段4,对于整个阶段,import
不应该进行宏扩展,除非另有规定()。对于这种情况是否另有规定I
- 这是否可能作为测试的一部分工作
- godbolt上的Clang和GCC不编译,但据我所知,它们还不支持在没有额外步骤的情况下导入标准库标题,并且它们给出了与速记版本相同的错误消息,这表明它可以工作(?)
- 同样的方法,但是使用
而不是include
,不适用于gcc和clang,因此可能不合法import
I代码>不被识别为指令,并且从I
的宏扩展中导入的不被识别。这反过来意味着在翻译阶段7中,它不会被识别为一个标识符,而只是在没有前面声明的情况下试图使用标识符import
这种舞蹈的目的是确保构建系统可以知道文件的依赖关系,而不必对文件进行完全预处理——如果可以通过宏替换形成导入,这将是必需的。为什么您要在code golf挑战中考虑合法性?我想您很难找到一个已经使用C++20的code golf网站无论如何,这不是一个代码交换问题,而是一个外部挑战,有自定义规则。其中一个规则是我们可以选择我们想要的C++标准版本,这样我们可以选择C++ 20。但是,我们的程序必须在所选标准中是合法的,并且不能依赖于特定于实现的行为。我认为这是您正在寻找的。无论如何都不会工作,预处理器只会转换文本,它无法创建新的预处理器指令,这正是您要尝试的。