在宏中使用 __FUNCTION__
Using __FUNCTION__ in a macro
使用:
#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
旧的非标准名称是 __FUNCTION__
。您现在应该更改所有代码以使用 __func__
。它们 defined/declared 也略有不同。
尽管听起来您的编译器确实有问题。如果 __func__
有效,我认为没有人再测试 __FUNCTION__
。
您可以使用错误的数据类型触发此问题。例如:
#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
通常会在编译时捕获此类错误并给出警告。
使用:
#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
旧的非标准名称是 __FUNCTION__
。您现在应该更改所有代码以使用 __func__
。它们 defined/declared 也略有不同。
尽管听起来您的编译器确实有问题。如果 __func__
有效,我认为没有人再测试 __FUNCTION__
。
您可以使用错误的数据类型触发此问题。例如:
#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
通常会在编译时捕获此类错误并给出警告。