请问下面的宏为什么要加上##,是变长参数的原因吗?[code]#define DEBUG(fmt, args...) fprintf(stderr, fmt, ##args)[/code]
by dengjin_cu - C/C++ - 2012-01-05 11:14:32 阅读(2181) 回复(4)
#define tile_num(x,y) ((y)*map_w+(x)) //将 x,y 坐标转换为地图上块的编号 #define tile_x(n) ((n)%map_w) //由块编号得出 x,y 坐标 #define tile_y(n) ((n)/map_w) void printpath(int *path) { int i; for (i=0;path>=0;i++) { gotoxy(tile_x(path)+1,tile_y(path)+1); //181行 cprintf("\xfe"); } } 编译 a.c:181: error: invalid operands to binary % a.c:181: error: invalid operands to binary / 出...
看了RADIUS的源代码: #ifndef _SELECT_H #define _SELECT_H 第二行#define _SELECT_H之后并没有给_SELECT_H值啊? 这是怎么回事? 我的理解: _SELECT_H是unix系统的值,但是为什么第二行没有给_SELECT_H进行宏替换的值呢?
我在《C程序设计语言》dennis Ritchie这本书中看到对宏定义的语法描述为: #define 名字 替换文本 这个很容易理解, 但是今天我在一本书上看到有这样一条宏替换语句: #define SWITCH_PRESSED (bit) 1 对此,我感到疑惑,为什么在“#define”后面有三个部分,而不是只有 “名字”和“替换文本”两个部分? 难道是把“(bit) 1 ”当做一个整体作为替换文本吗?
今天看u-boot的源码,发现 #define XMK_STR(x) #x #define MK_STR(x) XMK_STR(x) 上网搜了一下,#x就是给x加双引号 自己写了几句测试: A(1234)和B(1234)执行的结果一样,但是A(x)和B(x)为何不一样?宏展开是怎么展开的
首先,在arch/i386/kernel/vmlinux.lds中有 /* will be freed after init */ . = ALIGN(4096); /* Init code and data */ __init_begin = .; /* 此处省略若干行:) */ . = ALIGN(32); [color="red"] __per_cpu_start = .; .data.percpu : { *(.data.percpu) } __per_cpu_end = .; . = ALIGN(4096); __init_end = .; /* freed after init ends here */ 这说明__per_cpu_start和__per_cpu_end标识.dat...
首先,在arch/i386/kernel/vmlinux.lds中有 /* will be freed after init */ . = ALIGN(4096); /* Init code and data */ __init_begin = .; /* 此处省略若干行:) */ . = ALIGN(32); __per_cpu_start = .; .data.percpu : { *(.data.percpu) } __per_cpu_end = .; . = ALIGN(4096); __init_end = .; /* freed after init ends here */ 这说明__per_cpu_start和__per_cpu_end标识.data.percpu这个sect...
define_machine定义为: include/asm-powerpc/machdep.h #define __machine_desc __attribute__ ((__section__ (".machine.desc"))) #define define_machine(name) \ extern struct machdep_calls mach_##name; \ EXPORT_SYMBOL(mach_##name); \ struct machdep_calls mach_##name __machine_desc = 它的使用,比如:...
#define VH (*(int far*)0x450) // 怎么去解释它 , 是far 指针指向450位址吗?? //它是放在标头档内 VH 就可以直接把 int 型态的值存到450地址里面吗??? 我搞不懂的是450 内存地址会不会有其他程式在使用??? 如果直接把值存入 不是有问题 #define VH (*(int far*)0x450) // 改成 #define VH (*(int *far)0x450) 可以吗?? // 因为一般指针宣告不是 int * far ... 怎么巨集中会用int far* 还有#define VH (*(int far*)0x...
本帖最后由 LostC 于 2011-05-06 15:34 编辑 宏的定义:[code]#define MS_FILTER_METHOD_ID(_id_,_cnt_,_argsize_) \ ( (((unsigned long)(_id_)) & 0xFFFF)<<16 | (_cnt_<<8) | (_argsize_ & 0xFF )) [/code]是怎么工作的?有知道的说下哈,谢谢咯!!
是C语言参考手册上的一个例子。 定义一个宏: #define insert(stmt) stmt 调用的方法: insert( {a=1; b=1;} ) //正确 insert( {a=1, b=1;} ) //error:传递太多参数给宏insert 帮忙解释一下原因啊! [ 本帖最后由 Godbach 于 2007-8-28 16:48 编辑 ]