在 C 中定义自定义语法“until”

Muh*_*ira 0 c syntax macros preprocessor-directive

我希望我可以做这样的事情:

int i = 0;
until (i == 2){
  printf("yes\n");
  i++;
}
Run Code Online (Sandbox Code Playgroud)

在不详细说明具体内容的until情况下,我确信读者从上面的代码中知道算法是什么。是的,我知道我可以使用while(!condition){}.

输出将是:

yes
yes
Run Code Online (Sandbox Code Playgroud)

那么我有可能实现我的目标吗?

我觉得宏可以用define其他东西来做到这一点。但我缺乏关于 C 中预处理指令语法的知识

#define until <what should I fill here>
Run Code Online (Sandbox Code Playgroud)

编辑:很多人都是因为我在做什么而触发的。如果打扰你们了,我很抱歉。别担心,这个语法仅供我自己使用。所以我希望不要打扰那些不小心读到我代码的代码读者或者C牧师。

Lun*_*din 10

首先,我必须强调这一点:使用类似函数的宏来创建你自己的秘密、私有语言是 C 语言中的一大罪过。这可能是你能做的最糟糕的事情。

为什么?因为阅读您代码的其他人应该了解 C。但是,他们不应该了解您的秘密私有宏语言。此外,他们绝对没有兴趣学习你的秘密私人宏语言。

所以请不要在实际程序中做这样的事情。


话虽这么说,您自己几乎已经回答了这个问题:

#define until(condition) while(!(condition))
Run Code Online (Sandbox Code Playgroud)

请注意condition,作为类似函数的宏参数,应放在括号内。这可以防止意外的运算符优先级错误。例如,如果调用者通过,until(i + 1)那么您希望它循环while(!(i+1))不是 while(!i + 1)

  • 我建议使用“__VA_ARG__”,以防有人决定将逗号运算符“,”放入条件中。它偶尔会发生。`#define 直到(...) while(!(__VA_ARGS__))` (4认同)

Har*_*ith 6

来自专家 C 编程

宏的使用最好局限于命名文字常量,即一些精心选择的结构的简写。定义宏名称时全部大写,这样在使用时,就可以立即清楚它不是函数调用。避免使用任何修改底层语言的 C 预处理器,使其不再是 C。

回复:“我确信读者知道上面代码中的算法是什么。”


不,这会让人更加困惑,因为关键字until不是C语言的一部分。输入一些额外的字符并不需要太多。

话虽这么说,你可以这样做:

#define until(condition) while(!(condition))
Run Code Online (Sandbox Code Playgroud)

使用以下命令编译您的程序:

gcc -E -nostdinc main.c
Run Code Online (Sandbox Code Playgroud)

查看预处理器做了什么改变。

但这仍然是一种令人憎恶的行为,是人们不会容忍的事情。