gpt4 book ai didi

c - 在宏中使用 __FUNCTION__

转载 作者:行者123 更新时间:2023-12-02 08:22:23 30 4
gpt4 key购买 nike

使用:

#define DEBUG_FOO(foo) fprintf(stderr, "foo is %x, currently in %s\n", foo, __FUNCTION__);

将打印:

foo is 0, currently in (null)

使用时:

#define DEBUG_FOO(foo) fprintf(stderr, "currently in %s, foo is %x\n", __FUNCTION__, foo);

将打印:

currently in foo_bar, foo is 0

这里发生了什么?我希望两者都可以工作,或者都将 __FUNCTION__ 设置为 null。

使用的编译器是linaro arm-linux-gnueabihf-gcc

最佳答案

您可以使用错误的数据类型触发此问题。例如:

#include <stdio.h>
#include <stdint.h>

int main(int argc, char **argv) {
uint64_t foo = 0;
fprintf(stdout, "foo is %x, currently in %s\n", foo, __FUNCTION__);
return 0;
}

如果为 amd64 架构编译,它工作正常:

foo is 0, currently in main

对于 x86 (gcc -m32 test.c):

foo is 0, currently in (null)

这就是可变参数函数参数扩展的方式,初始程序有一个错误。在这种特殊情况下,格式参数应该是 "%"PRId64 并且 %x 需要 int

用相反的顺序它有点工作,因为指针有更好的宽度处理,位它仍然是错误的。

在 gcc/clang 的情况下,-Wformat 通常会在编译时捕获此类错误并给出警告。

关于c - 在宏中使用 __FUNCTION__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35822030/

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