Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 预处理:定义“导入”的缩写合法吗?_C++_Language Lawyer_C Preprocessor_C++20 - Fatal编程技术网

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
  • 我认为处理
    import
    指令应该发生在翻译阶段4,对于整个阶段,
    I
    不应该进行宏扩展,除非另有规定()。对于这种情况是否另有规定
  • 这是否可能作为测试的一部分工作
  • godbolt上的Clang和GCC不编译,但据我所知,它们还不支持在没有额外步骤的情况下导入标准库标题,并且它们给出了与速记版本相同的错误消息,这表明它可以工作(?)
  • 同样的方法,但是使用
    include
    而不是
    import
    ,不适用于gcc和clang,因此可能不合法

:

预处理指令由一系列预处理组成 满足以下约束的令牌:在 翻译阶段4,序列中的第一个标记,称为 引入令牌的指令,以 源文件(可选在不包含新行的空白之后) 字符)或后跟至少包含一行新行的空白 字符,并且是[…]

在任何宏替换之前,在翻译阶段4开始时确定预处理指令的正确性。因此,
I不被识别为指令,并且从
I
的宏扩展中导入的
不被识别。这反过来意味着在翻译阶段7中,它不会被识别为一个标识符,而只是在没有前面声明的情况下试图使用标识符
import


这种舞蹈的目的是确保构建系统可以知道文件的依赖关系,而不必对文件进行完全预处理——如果可以通过宏替换形成导入,这将是必需的。

为什么您要在code golf挑战中考虑合法性?我想您很难找到一个已经使用C++20的code golf网站无论如何,这不是一个代码交换问题,而是一个外部挑战,有自定义规则。其中一个规则是我们可以选择我们想要的C++标准版本,这样我们可以选择C++ 20。但是,我们的程序必须在所选标准中是合法的,并且不能依赖于特定于实现的行为。我认为这是您正在寻找的。无论如何都不会工作,预处理器只会转换文本,它无法创建新的预处理器指令,这正是您要尝试的。