【问题标题】:Preprocessor directive to create keywords in C在 C 中创建关键字的预处理器指令
【发布时间】:2019-03-06 18:09:26
【问题描述】:

我想创建这个...

int main(void) {
  int i;

  for(i = 0; i < 10; i++){
    //Not an important Code
  }
  return 0;
}

以更奇特的方式,创造疯狂的想法!
可以这样改写吗?

#define A f
#define B or

int main(void) {
  int i;

  AB(i = 0; i < 10; i++){
    //Not an important Code
  }
  return 0;
}

我需要知道是否可以创建类似由不同 #defines

组成的简单 for 的指令

【问题讨论】:

  • 算了。尝试对关键字进行懒惰的实现是徒劳的,并且会使您发明的代码难以阅读。
  • 避免预处理魔法;它使代码不可读。您可以将宏替换文本中的标记与###define C(a, b) a ## b 连接起来,然后C(A, B) 或多或少会做你想做的事;您只需在连接之前评估表达式:#define E(a) a#define C(a, b) E(a) ## E(b)C(A,B)。但这很令人反感,尤其是对于拆分关键字。
  • @JonathanLeffler 我尝试了你的想法,但它对我不起作用。 Gcc 响应:粘贴 ")" 和 "E" 没有给出有效的预处理标记 #define C(a, b) E(a)##E(b)
  • 好的;如您所知,我没有测试它。这是可行的(通过宏定义的标记的串联);有关于如何做到这一点的答案(有些是我过去写的)。这不是一个好主意 - 这是带回家的。 (工作宏集:#define A f——#define B or——#define E(a, b) a ## b——#define C(a, b) E(a, b)——``——C(A,B)——输出,for。)
  • @JonathanLeffler 你能提供链接吗? :)

标签: c compilation macros preprocessor


【解决方案1】:

制作

#define A f
#define B or
#define C(x, y) x##y
#define D(x,y) C(x,y)

然后

D(A, B)(i = 0; i < 10; i++)

将被改写为

for (i = 0; i < 10; i++)

【讨论】:

  • 我认为您需要 A 和 B 的类似对象的宏,而不是类似函数的宏 - 如问题所示。
猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多