如何包含循环初始声明和gnu扩展?

时间:2015-02-28 03:59:40

标签: c gcc string.h

我有这段代码:

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

我如何做到这两点?有可能吗?

1 个答案:

答案 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会告诉你更多信息。