gpt4 book ai didi

c - 算术表达式作为c中宏的参数

转载 作者:行者123 更新时间:2023-12-04 11:33:58 25 4
gpt4 key购买 nike

在预处理程序指令#define中使用宏我已经编写了以下两个代码。


第一个代码传递表达式,例如a + b



_valid_pagesize(a + b)



在第二个代码



c = a + b


然后将此c作为参数传递给macro。


_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


它按预期工作。

关于c - 算术表达式作为c中宏的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29247980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com