当前位置: 技术问答>linux和unix
问题简单问题,linux源码中的" # "是什么意思?
来源: 互联网 发布时间:2015-07-10
本文导语: include/linux/module.h #define __MODULE_STRING_1 #x 请问#x中的#是什么语法? | 宏可以用字符串化运算符“#”和连接运算符“##”。 “#”能将宏的参数转换为带双引号的字符串: #define DEBUG_VALUE(v) prin...
include/linux/module.h
#define __MODULE_STRING_1 #x
请问#x中的#是什么语法?
#define __MODULE_STRING_1 #x
请问#x中的#是什么语法?
|
宏可以用字符串化运算符“#”和连接运算符“##”。
“#”能将宏的参数转换为带双引号的字符串:
#define DEBUG_VALUE(v) printf(#v”is equal to %dn”,v)
可以在程序中用DEBUG_VALUE宏检查变量值:
int x = 20;
DEBUG_VALUE(x);
将打印“x is equal to 20”,这是一种很方便的调试工具。
“##”把两个独立的字符串连接成一个字符串:
#include
#define SORT(type) sort_##type
void sort_int(int **i);
void sort_long(long **l);
void sort_float(float **f);
void sort_char(char **c);
void main(void);
void main(void)
{
int **ip;
long **lp;
float **fp;
char **cp;
…
SORT(int)(ip);
SORT(long)(lp);
SORT(float)(fp);
SORT(char)(cp);
…
}
程序对四种数据类型排序。SORT(int)(ip);经编译预处理转换为sort_int(ip);这个宏对类型不敏感。如果在运行时才能确定调用哪个函数,可用此法。
那么,又有一个问题,宏和函数哪个更好呢?宏有一个优点,比函数效率更高,更快,因为它是直接展开,而调用函数还需堆栈,保存地址等额外开销。但宏不能处理大的复杂的代码结构。此外,宏的逐行展开会使程序变大,而函数不会。
所以,一般来说,用宏替换小的可重复的代码段,可以运行更快;而任务复杂或要求程序短小时,用函数。
“#”能将宏的参数转换为带双引号的字符串:
#define DEBUG_VALUE(v) printf(#v”is equal to %dn”,v)
可以在程序中用DEBUG_VALUE宏检查变量值:
int x = 20;
DEBUG_VALUE(x);
将打印“x is equal to 20”,这是一种很方便的调试工具。
“##”把两个独立的字符串连接成一个字符串:
#include
#define SORT(type) sort_##type
void sort_int(int **i);
void sort_long(long **l);
void sort_float(float **f);
void sort_char(char **c);
void main(void);
void main(void)
{
int **ip;
long **lp;
float **fp;
char **cp;
…
SORT(int)(ip);
SORT(long)(lp);
SORT(float)(fp);
SORT(char)(cp);
…
}
程序对四种数据类型排序。SORT(int)(ip);经编译预处理转换为sort_int(ip);这个宏对类型不敏感。如果在运行时才能确定调用哪个函数,可用此法。
那么,又有一个问题,宏和函数哪个更好呢?宏有一个优点,比函数效率更高,更快,因为它是直接展开,而调用函数还需堆栈,保存地址等额外开销。但宏不能处理大的复杂的代码结构。此外,宏的逐行展开会使程序变大,而函数不会。
所以,一般来说,用宏替换小的可重复的代码段,可以运行更快;而任务复杂或要求程序短小时,用函数。
|
请不要打错(我帮你查了):
include/linux/module.h
#define __MODULE_STRING_1(x) #x
#是粘贴字符窜的意思
__MODULE_STRING_1(hellwolf)
就转换为hellwolf
补充一点当你需要连接字符窜时用##
msdn:
#define paster( n ) printf( "token" #n " = %d", token##n )
int token9 = 9;
If a macro is called with a numeric argument like
paster( 9 );
the macro yields
printf( "token" "9" " = %d", token9 );
which becomes
printf( "token9 = %d", token9 );
include/linux/module.h
#define __MODULE_STRING_1(x) #x
#是粘贴字符窜的意思
__MODULE_STRING_1(hellwolf)
就转换为hellwolf
补充一点当你需要连接字符窜时用##
msdn:
#define paster( n ) printf( "token" #n " = %d", token##n )
int token9 = 9;
If a macro is called with a numeric argument like
paster( 9 );
the macro yields
printf( "token" "9" " = %d", token9 );
which becomes
printf( "token9 = %d", token9 );
|
学习
|
上面之中我个人认为“齐柏林飞艇”有误导的地方
并不是inline不能够取代宏.而是因为宏先于inline于编译器而采用。
inline在编译中无优化时,则作为独立函数使用。而在调试完成加入优化编译后,就成为宏一样融入到代码之中。所以说inline的功能更要优于宏。
并不是inline不能够取代宏.而是因为宏先于inline于编译器而采用。
inline在编译中无优化时,则作为独立函数使用。而在调试完成加入优化编译后,就成为宏一样融入到代码之中。所以说inline的功能更要优于宏。
|
inline毕竟有类型检查,而宏没有。带来了方便也来带了麻烦
两者应该共存,喜欢用什么就用什么
两者应该共存,喜欢用什么就用什么