c - 为什么类函数宏在 C 中以正序求值?

标签 c macros

C 程序如下:

#define p(x) (printf("%d ", x))
#define q(a,b,c) ({int total = a; printf("%d ", b); total += c;})
int main(){
    q(p(1), 2, p(3));
}

产生输出1 2 3,表明使用了正态顺序评估。但是,对于正常功能,例如此代码段:

int p(int i){
    printf("%d ", i);
    return i;
}

void q(int a, int b, int c){
    int total = a;
    printf("%d ", b);
    total += c;
}
int main(){
    q(p(1), 2, p(3));
}

输出为1 3 2,这意味着使用了应用顺序评估。这种行为的根本原因是什么?与函数相比,宏的参数如何计算?

最佳答案

宏参数在求值之前已完全展开,因此编译器将按 p、p、q 的顺序求值宏。然而,代码在此阶段并未实际执行,只是扩展为文本。

因此您的第一个示例将扩展为:

int main() {
    ({int total = (printf("%d", 1); printf("%d", 2); total += printf("%d", 3);});
}

然后根据正常的 C 规则将其编译为语句序列。

对于函数,编译器会分别为每个函数生成代码,然后在使用函数的地方进行调用。这意味着它必须知道 q 的参数值,然后才能调用 q。

关于c - 为什么类函数宏在 C 中以正序求值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34234921/

相关文章:

c - 计算以字符串形式给出的算术表达式

宏可以从其参数中删除字符吗?

macros - Julia - n 嵌套循环

c++ - 在非常大的文件中查找最常见的三项序列

c - 在 C 中获取 inf 输出的简单精度测试

c - 为什么即使服务器上没有运行此类服务,getaddrinfo 也会返回服务端口?

计算对数的平均值

c++ - 迭代 C++ 宏 "list"以生成代码

c - 为什么这段代码会出错?

c - 内联函数与宏函数