0

我有这个代码:

#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未定义。(或者更确切地说,它抱怨函数的隐式声明)

我该怎么做?是否可以?

4

1 回答 1

3

您需要在任何库 #include 之前_GNU_SOURCE定义功能测试宏。一种方便的方法是将其放在命令行中:

gcc -std=c11 -D_GNU_SOURCE program.c -o program

或者您可以将#define 放在每个需要它的文件的最顶部。(将它们放在源文件中可能会更好,但我已经养成了将它们放在我的 Makefiles.YMMV 中的习惯。)

您可以在手册页中查看每个 C 库函数所需的功能测试宏。例如,man memrchr包括:

glibc 的功能测试宏要求(参见 feature_test_macros(7)):

  memrchr(), rawmemchr(): _GNU_SOURCE

如前所述,man feature_test_macros会告诉你更多。

于 2015-02-28T04:04:27.953 回答