使用预处理器定义函数调用的缺点是什么?

Hec*_*ier 6 c++ c-preprocessor

我想知道以这种方式使用预处理器的缺点:

#define SOME_FUNCTION someFunction(someArgument)
Run Code Online (Sandbox Code Playgroud)

基本上我觉得这是错误的(或者当然不是最佳实践) - 但我不确定为什么......我的预处理技能充其量是生锈的.

Ric*_*ton 5

缺点?通常,宏定义不会在可执行文件的符号表中结束.调试稍微困难一些.


Mar*_*ork 5

问题是每次使用时都会重新评估参数:

#define MIN(A,B)   ((A) < (B))?(A):(B);
Run Code Online (Sandbox Code Playgroud)

请注意,我必须将所有参数包装在'('')'中,以确保表达式对corectly进行求值.但是如果我们这样做会发生什么?

int  s = MIN(++current,Max);
Run Code Online (Sandbox Code Playgroud)

编码这个我希望在调用函数之前电流增加一次.但是因为它是一个宏,它在测试中增加一次,如果它仍然小于Max,则增加一次


mar*_*inr 0

这在非常封闭的领域中有时很有用,可以以更易读的方式定义流程步骤:

void myfunc() {
  DO_STEP_ONE;
  THEN_ANOTHER_STEP;
  KEEP_GOING;
  LAST_STEP;
}
Run Code Online (Sandbox Code Playgroud)

但通常它只会让代码更难阅读和理解。

除非代码的读者值得详细了解这些 #define 的含义,而且这是某种捷径,否则您只是让人们查看两个地方来理解一行代码(文件顶部和文件中)函数)而不是一个。

我很少使用这种方法。