我有这段代码:
#include <string.h>
#include <stdio.h>
char numbers[5] = "12345";
int main(){
memrchr(numbers,'2',5);
for(int i=0;i<5;i++){
printf("%d",i);
}
return 0;
}
它用于循环初始声明(for(int i
)和gnu扩展(memrchr
)。
我正在使用编译器gcc
问题在于,两者似乎都无法通过。我可以做到
gcc program.c -o program
抱怨for循环,或者我可以做
gcc -std=gnu11 program.c -o program
抱怨memrchr
未定义。 (或者更确切地说,它抱怨函数的隐式声明)
我如何做到这两点?有可能吗?
答案 0 :(得分:3)
您需要在任何库#include 之前定义_GNU_SOURCE
功能测试宏。一种方便的方法是将它放在命令行中:
gcc -std=c11 -D_GNU_SOURCE program.c -o program
或者你可以将#define放在需要它的每个文件的最顶层。 (将它们放在源文件中可能更好,但我已经习惯将它们放入我的Makefile中.YMMV。)
您可以在每个C库函数的联机帮助页中看到所需的功能测试宏。例如,man memrchr
包括:
glibc的功能测试宏要求(参见feature_test_macros(7)):
memrchr(), rawmemchr(): _GNU_SOURCE
如上所述,man feature_test_macros
会告诉你更多信息。