为什么要定义一个函数原型,然后定义一个同名的预处理器宏?
Why define a function prototype, then preprocessor macro with the same name?
我正在读一本关于 C 的书,在作者代码的某处我找到了一个函数原型的定义,然后是一个同名的宏,而且函数本身也没有任何定义 .h
或 .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 */
代码有效,但我只是不明白为什么他首先需要一个函数原型?他就不能写个宏吗?重点是什么?是告诉编译器应该将宏计算为表达式 which returns int
还是什么?删除原型似乎并没有改变行为。这个作者没有解释。
这是一种过时的做法,在 inline
功能之前。如果您像 print_my_stuff("hello")
中那样调用该函数,那么预处理器将看到调用语法并插入宏的内容。如果您使用其他名称,如 f_ptr = &print_my_stuff
,编译器将使用实际函数。
调用函数 (print_my_stuff)("hello")
也会绕过宏。一些偏执的风格指南甚至要求用括号括起某些函数名称,因为宏是邪恶的。
我正在读一本关于 C 的书,在作者代码的某处我找到了一个函数原型的定义,然后是一个同名的宏,而且函数本身也没有任何定义 .h
或 .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 */
代码有效,但我只是不明白为什么他首先需要一个函数原型?他就不能写个宏吗?重点是什么?是告诉编译器应该将宏计算为表达式 which returns int
还是什么?删除原型似乎并没有改变行为。这个作者没有解释。
这是一种过时的做法,在 inline
功能之前。如果您像 print_my_stuff("hello")
中那样调用该函数,那么预处理器将看到调用语法并插入宏的内容。如果您使用其他名称,如 f_ptr = &print_my_stuff
,编译器将使用实际函数。
调用函数 (print_my_stuff)("hello")
也会绕过宏。一些偏执的风格指南甚至要求用括号括起某些函数名称,因为宏是邪恶的。