我正在读一本关于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
的表达式还是什么?删除原型似乎不会改变行为。作者没有解释这一点。
答案 0 :(得分:8)
从inline
函数开始,这是一种过时的做法。如果您在print_my_stuff("hello")
中调用该函数,则预处理器将看到调用语法并插入宏的内容。如果您使用其他名称,如f_ptr = &print_my_stuff
中所示,编译器将使用实际函数。
将函数调用为(print_my_stuff)("hello")
也将绕过宏。一些偏执风格指南甚至需要将某些函数名称括起来,因为Macros Are Evil。