何时使用预处理器在C中定义函数?
什么时候应该使用C预处理器定义函数?下面是一个简单的例子:何时使用预处理器在C中定义函数?,c,c-preprocessor,C,C Preprocessor,什么时候应该使用C预处理器定义函数?下面是一个简单的例子: #define isUnderscore(ch) ((ch) == '_') 在这方面: // just to make the bool more clear. typedef enum { false, true } bool; bool isUnderscore(char x) { return x == '_'; } 这可能是一个愚蠢的问题,但我无法通过快速的谷歌搜索找到任何结果。如果要放弃类型安全性,通常
#define isUnderscore(ch) ((ch) == '_')
在这方面:
// just to make the bool more clear.
typedef enum {
false, true
} bool;
bool isUnderscore(char x) {
return x == '_';
}
这可能是一个愚蠢的问题,但我无法通过快速的谷歌搜索找到任何结果。如果要放弃类型安全性,通常会使用预处理器
IsUnderline
作为宏将接受ch
的任何类型,而=
对其有意义
根据经验,除非绝对必要,否则不要使用预处理器:调试作为预处理器宏实现的函数很困难
(请记住,函数重载在C中不可用)。从C99开始,您可以将其编写为
内联
函数:
#include <stdbool.h>
inline bool isUnderscore(char x) {
return x == '_';
}
#包括
内联布尔值为下划线(字符x){
返回x=='';
}
这为您提供了正常函数的安全性和类型检查,以及类似于宏的函数的效率(尽管这方面没有保证)
从N1570(C11草案)6.7.4/6
功能说明符(重点是我的):
使用inline
函数说明符声明的函数是内联函数
功能。使函数成为内联函数意味着调用
函数必须尽可能快
哪些建议是有效的
已定义实施(参见第139页)
一般规则是,如果您可以在语言本身而不是预处理器中执行某些操作,那么您应该这样做
几十年前,如果宏是内联的,那么性能可能会有所提高,但您可能使用的任何编译器都会进行这些琐碎的优化。这里的内联关键字和优化也是这样吗?因为我记得读到编译器选择何时内联一个函数。是的,这只是为了指导;更像是
register
@reefourann:添加了标准的摘录。实际上,一些编译器(如GCC)能够在此类函数未有效内联时发出警告。