如何同时包含 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 会告诉你更多。