![]() |
1
1
如果参数列表保持不变,这没关系,因为它将被视为一个表达式。如果我们有一个表达式,而我们对它不做任何修改,那么它将被优化掉(在任何合适的编译器上)。考虑 the following :
编译器将看到以下代码,以便
此表达式的计算结果为3.14(逗号运算符返回其右操作数)。这样一个表达式被悄悄地优化了。 |
![]() |
2
3
这里的好处是,如果有人真的费心检查printf的返回,它将继续编译(很少,但并非闻所未闻)。 |
![]() |
3
2
以下工作,至少在gcc 8中进行。简单搜索表明,可变宏是在C99中引入的:
您希望使用ol的“do{}while(0)”技巧,以避免以下意外情况:
你做不到
|
![]() |
4
2
如果完全没有输出printf语句,则可能存在一个潜在的bug。考虑下面的代码:
当您用宏替换printf调用时,您可能仍然希望确保内部函数调用
然后在代码中:
编译器将优化空函数调用,并且仍然调用
|
![]() |
5
1
只需使用 lambda : ( Variadic macros 自从 C99 )
这样做只是简单地替换
或者,这就足够了:
编辑: 你 可以 也可使用:
|
![]() |
Imad Hamaidi · 如何使预处理器宏在编译之前对代码求值 2 年前 |
![]() |
Lightsout · 用于填充表的sql连接压缩行 2 年前 |
![]() |
Rogue258 · 在DB2SQL中使用存储过程/宏进行声明和循环 2 年前 |
![]() |
allthem · 将VBA设置为仅在第一次打开电子表格时自动运行 3 年前 |
![]() |
user306080 · 下面的宏在做什么? 3 年前 |
![]() |
Xev · 运行时错误91:对象变量或未设置块 3 年前 |
![]() |
digital illusion · 请参阅宏扩展中的外部板条箱 3 年前 |
![]() |
Aleph · 标识符在C预处理器指令中的作用是什么 3 年前 |
![]() |
Gakuo · 使用lisp循环宏进行高级循环 6 年前 |