问题简单问题,linux源码中的" # "是什么意思?

include/linux/module.h
#define __MODULE_STRING_1 #x

请问#x中的#是什么语法?
---------------------------------------------------------------

请不要打错(我帮你查了):
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 );

---------------------------------------------------------------

宏可以用字符串化运算符“#”和连接运算符“##”。
“#”能将宏的参数转换为带双引号的字符串:
#define DEBUG_VALUE(v) printf(#v”is equal to %d\n”,v)
可以在程序中用DEBUG_VALUE宏检查变量值:
int x = 20;
DEBUG_VALUE(x);
将打印“x is equal to 20”,这是一种很方便的调试工具。
“##”把两个独立的字符串连接成一个字符串:
#include

 1<stdio.h>   
 2#define SORT(type) sort_##type   
 3void sort_int(int **i);   
 4void sort_long(long **l);   
 5void sort_float(float **f);   
 6void sort_char(char **c);   
 7void main(void);   
 8void main(void)   
 9{   
10int **ip;   
11long **lp;   
12float **fp;   
13char **cp;   
1415SORT(int)(ip);   
16SORT(long)(lp);   
17SORT(float)(fp);   
18SORT(char)(cp);   
1920}   
21程序对四种数据类型排序。SORT(int)(ip);经编译预处理转换为sort_int(ip);这个宏对类型不敏感。如果在运行时才能确定调用哪个函数,可用此法。   
22那么,又有一个问题,宏和函数哪个更好呢?宏有一个优点,比函数效率更高,更快,因为它是直接展开,而调用函数还需堆栈,保存地址等额外开销。但宏不能处理大的复杂的代码结构。此外,宏的逐行展开会使程序变大,而函数不会。   
23所以,一般来说,用宏替换小的可重复的代码段,可以运行更快;而任务复杂或要求程序短小时,用函数。   
24  
25\---------------------------------------------------------------   
26  
27学习   
28\---------------------------------------------------------------   
29  
30上面之中我个人认为“齐柏林飞艇”有误导的地方   
31并不是inline不能够取代宏.而是因为宏先于inline于编译器而采用。   
32inline在编译中无优化时,则作为独立函数使用。而在调试完成加入优化编译后,就成为宏一样融入到代码之中。所以说inline的功能更要优于宏。   
33\---------------------------------------------------------------   
34  
35inline毕竟有类型检查,而宏没有。带来了方便也来带了麻烦   
36两者应该共存,喜欢用什么就用什么</stdio.h>
Published At
Categories with 服务器类
Tagged with
comments powered by Disqus