Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
何时使用预处理器在C中定义函数?_C_C Preprocessor - Fatal编程技术网

何时使用预处理器在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 == '_'; } 这可能是一个愚蠢的问题,但我无法通过快速的谷歌搜索找到任何结果。如果要放弃类型安全性,通常

什么时候应该使用C预处理器定义函数?下面是一个简单的例子:

#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)能够在此类函数未有效内联时发出警告。