如何同时包含 for 循环初始声明和 gnu 扩展?
How to include both for loop initial declarations and gnu extensions?
我有这个代码:
#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 循环初始声明 (for(int i
) 和 gnu 扩展 (memrchr
)。
我正在使用编译器gcc
问题是它似乎并没有让两者都通过。我可以做
gcc program.c -o program
哪个抱怨 for 循环,或者我可以做
gcc -std=gnu11 program.c -o program
抱怨 memrchr
未定义。 (或者更确切地说,它抱怨函数的隐式声明)
我该如何做到这两点?可能吗?
您需要在任何库 #include 之前定义 _GNU_SOURCE
功能测试宏 。一个方便的方法是将它放在命令行中:
gcc -std=c11 -D_GNU_SOURCE program.c -o program
或者您可以将#define 放在每个需要它的文件的最顶部。 (将它们放在源文件中可能更好,但我已经养成了将它们放在我的 Makefile 中的习惯。YMMV。)
您可以在每个 C 库函数的联机帮助页中看到所需的功能测试宏。例如,man memrchr
包括:
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
memrchr(), rawmemchr(): _GNU_SOURCE
如上所说,man feature_test_macros
会告诉你更多。
我有这个代码:
#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 循环初始声明 (for(int i
) 和 gnu 扩展 (memrchr
)。
我正在使用编译器gcc
问题是它似乎并没有让两者都通过。我可以做
gcc program.c -o program
哪个抱怨 for 循环,或者我可以做
gcc -std=gnu11 program.c -o program
抱怨 memrchr
未定义。 (或者更确切地说,它抱怨函数的隐式声明)
我该如何做到这两点?可能吗?
您需要在任何库 #include 之前定义 _GNU_SOURCE
功能测试宏 。一个方便的方法是将它放在命令行中:
gcc -std=c11 -D_GNU_SOURCE program.c -o program
或者您可以将#define 放在每个需要它的文件的最顶部。 (将它们放在源文件中可能更好,但我已经养成了将它们放在我的 Makefile 中的习惯。YMMV。)
您可以在每个 C 库函数的联机帮助页中看到所需的功能测试宏。例如,man memrchr
包括:
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
memrchr(), rawmemchr(): _GNU_SOURCE
如上所说,man feature_test_macros
会告诉你更多。