使用宏和预处理器指令 #define 我编写了以下两个代码。
_valid_pagesize(a+b)
c=a+b
然后将此 c 作为参数传递给宏。
_valid_pagesize(c)
第二个代码可以完美运行,而第一个代码则不能。
我们能不能像函数一样将表达式作为参数传递给宏?
为什么不..?
代码传递表达式作为参数:
#include<stdio.h>
#include<stdlib.h>
#define _valid_pagesize(_newsize) (!(_newsize % 0x80000000)?1: \
(!(_newsize % 0x40000000)?1: \
(!(_newsize % 0x10000000)?1: \
(!(_newsize % 0x4000000) ?1:0))))
int main(int argc, char* argv[]){
uint64_t size[2];
size[0]=atoi(argv[1]);
size[1]=atoi(argv[2]);
if(_valid_pagesize(size[0]+size[1])){
printf("success\n");
}
return 0;
}
宏规则#1 是将所有参数括在括号中,以避免出现您所看到的问题。
#define _valid_pagesize(_newsize) (!((_newsize) % 0x80000000)?1: \
(!((_newsize) % 0x40000000)?1: \
(!((_newsize) % 0x10000000)?1: \
(!((_newsize) % 0x4000000) ?1:0))))
当你通过时a+b
对于宏观来说,它展开为
a + b % 0x40000000
自从%
优先级高于+
,你没有得到你期望的结果。通过将参数括在括号中,宏将扩展为
(a + b) % 0x40000000
其按预期工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)