【问题标题】:How can I use "#" as a character in c++ preprocessor directives如何在 C++ 预处理器指令中使用“#”作为字符
【发布时间】:2023-04-11 06:05:01
【问题描述】:

我想将#include 重新定义为不同的词。我不知道 C++ 预处理是否可以做到这一点,但我正在尝试:

#define import #include
#define io <iostream>

import io

这显然不起作用,所以我只是想知道我是否可以在“import #include”语句中转义“#”以完全改变它,但这也需要对我的预处理器进行另一次运行相信。对此的任何意见将不胜感激。

对于任何想知道错误的人来说,错误输出是“Stray "#" found in statement...”。

编辑: 我查看了 cmets,现在我更了解了 c 预处理器的工作原理。我之前并没有真正理解它,但我想我找到了解决方法。这样做的原因是创建一种简单的方法来将导入语句从一种语言转换为包含 C++ 中的语句。该语言是我自己创造的,是的,它完成了其他语言无法做到的事情。

【问题讨论】:

  • 如果你想写phyton,为什么不写python呢?严重的是,这非常令人困惑,没有明显的收获。顺便说一句,我认为这是不可能的
  • 预处理器不会在扩展输出中查找指令,即使输出看起来像指令。因此,你不能做你想做的事。在 C11 中(不一定与 C++11 相同,但 C 和 C++ 处理器的功能本质上是相同的),标准说 §6.10.3.4 Rescanning and further replacement ¶4不处理生成的完全宏替换的预处理令牌序列作为预处理指令,即使它类似于一个,但是…….
  • 另请参阅How do I run the preprocessor on local headers only,了解“无法通过宏扩展创建预处理器指令”的规则被积极利用的场景。
  • @JonathanLeffler:值得注意的是_Pragma 不是预处理器指令,因此它可以由宏生成。据我所知,这是宏可以生成预处理器指令效果(即#pragma 的效果)的唯一情况。
  • @Cheersandhth.-Alf:你说得对——这就是but … 子句继续说的内容:但是其中的所有 pragma 一元运算符表达式随后按照 6.10 中的规定进行处理。 9 下面。评论中没有足够的空间来写所有这些。

标签: c++ c-preprocessor


【解决方案1】:

您不能通过 C++ 语言中的工具(包括预处理器)重新定义 #include,抱歉。

但是您可以通过任何程序对源代码进行预处理,即使是用 C++ 编写的程序也是如此。虽然我的印象是脚本语言是最常见的选择。但是,这样做是有充分理由的。

例如,包括我自己在内的一些人认为 Qt 框架中的预处理是 Evil™。在现代 C++(C++11 之后的语言)中,这当然是不必要的。但该框架早于现代 C++。

【讨论】:

  • 这会让 QT 成为掠食者吗?
  • 如果是,那么它就是 Qt 掠夺者。 :)
猜你喜欢
  • 2017-07-07
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 2023-03-05
相关资源
最近更新 更多