【问题标题】:How to include both for loop initial declarations and gnu extensions?如何同时包含 for 循环初始声明和 gnu 扩展?
【发布时间】:2015-02-28 03:59:40
【问题描述】:

我有这个代码:

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

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

【问题讨论】:

    标签: c gcc string.h


    【解决方案1】:

    您需要在任何库#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 会告诉您更多信息。

    【讨论】:

    • 谢谢,能详细点吗?有没有我错过的网页?
    • 您可以在网上阅读手册页,但在您自己的机器上阅读它们通常更方便。
    • @shelvacu:输入man memrchr 应该会显示memchr 函数的手册页。
    猜你喜欢
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 2016-06-07
    • 2015-07-21
    相关资源
    最近更新 更多