为什么要定义函数原型,然后使用相同名称的预处理器宏?

时间:2015-12-24 04:12:25

标签: c c-preprocessor

我正在读一本关于C的书,在作者代码的某处我发现了一个函数原型的定义,然后是一个同名的宏,并且没有任何函数本身的定义{ {1}}或.c文件。

我的意思是这样的:

int print_my_stufff(char *stuff);
#define print_my_stuff(A) (printf("%s\n", A))
/* and print-my-stuff() function never defined anywhere else */

代码有效,但我不知道为什么他首先需要一个函数原型?他不能写一个宏吗?重点是什么?是告诉编译器应该将宏评估为返回int的表达式还是什么?删除原型似乎不会改变行为。作者没有解释这一点。

1 个答案:

答案 0 :(得分:8)

inline函数开始,这是一种过时的做法。如果您在print_my_stuff("hello")中调用该函数,则预处理器将看到调用语法并插入宏的内容。如果您使用其他名称,如f_ptr = &print_my_stuff中所示,编译器将使用实际函数。

将函数调用为(print_my_stuff)("hello")也将绕过宏。一些偏执风格指南甚至需要将某些函数名称括起来,因为Macros Are Evil。