当前位置: 技术问答>linux和unix
linux 内核的一个宏
来源: 互联网 发布时间:2016-04-23
本文导语: 源文件: static int __init parse_tag_serialnr(const struct tag *tag) { system_serial_low = tag->u.serialnr.low; system_serial_high = tag->u.serialnr.high; return 0; } __tagtable(ATAG_SERIAL, parse_tag_serialnr); 其中定义的宏有: #define __tagtable(tag, f...
源文件:
static int __init parse_tag_serialnr(const struct tag *tag)
{
system_serial_low = tag->u.serialnr.low;
system_serial_high = tag->u.serialnr.high;
return 0;
}
__tagtable(ATAG_SERIAL, parse_tag_serialnr);
其中定义的宏有:
#define __tagtable(tag, fn)
static struct tagtable __tagtable_##fn __tag = { tag, fn }
#define ATAG_SERIAL 0x54410006
请问__tagtable(ATAG_SERIAL, parse_tag_serialnr);展开是什么样?
宏__tagtable里的__tagtable_##fn是什么意思?
static int __init parse_tag_serialnr(const struct tag *tag)
{
system_serial_low = tag->u.serialnr.low;
system_serial_high = tag->u.serialnr.high;
return 0;
}
__tagtable(ATAG_SERIAL, parse_tag_serialnr);
其中定义的宏有:
#define __tagtable(tag, fn)
static struct tagtable __tagtable_##fn __tag = { tag, fn }
#define ATAG_SERIAL 0x54410006
请问__tagtable(ATAG_SERIAL, parse_tag_serialnr);展开是什么样?
宏__tagtable里的__tagtable_##fn是什么意思?
|
##用于连接两个串
__tagtable(ATAG_SERIAL, parse_tag_serialnr);
展开后
static struct tagtable __tagtable_parse_tag_serialnr __tag =
{ ATAG_SERIAL, parse_tag_serialnr }
__tagtable(ATAG_SERIAL, parse_tag_serialnr);
展开后
static struct tagtable __tagtable_parse_tag_serialnr __tag =
{ ATAG_SERIAL, parse_tag_serialnr }
|
准确地说, 是连接两个token。
A ## B 和 A##B 效果是一样的,中间的空格不影响。
参考下面代码,运行了试试看, 理解 # 和 ##
A ## B 和 A##B 效果是一样的,中间的空格不影响。
参考下面代码,运行了试试看, 理解 # 和 ##
#include
#include
struct command
{
char *name;
void (*function) (void);
};
void quit_command(void)
{
printf("quit_commandn");
}
void help_command(void)
{
printf("help_commandn");
}
#define COMMAND(NAME) { #NAME, NAME ## _command }
struct command commands[] = {
COMMAND(quit),
COMMAND(help),
};
int main(){
int i = 0;
for (i = 0; i