函数'strtok_r'[-Wimplicit-function-declaration]的隐式声明尽管包括<string.h>

job*_*bin 6 c string tokenize strtok gcc-warning

我有以下代码来标记包含由行分隔的行的字符串,\n并且每行具有由以下内容分隔的整数\t:

void string_to_int_array(char file_contents[BUFFER_SIZE << 5], int array[200][51]) {
  char *saveptr1, *saveptr2;
  char *str1, *str2;
  char delimiter1[2] = "\n";
  char delimiter2[2] = " ";
  char line[200];
  char integer[200];
  int j;
  for(j = 1, str1 = file_contents; ; j++, str1 = NULL) {
    line = strtok_r(str1, delimiter1, &saveptr1);

    if (line == NULL) {
      break;
    }


    for (str2 = line; ; str2 = NULL) {
      integer = strtok_r(str2, delimiter2, &saveptr2);
      if (integer == NULL) {
        break;
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

(此处仅包含相关功能,如果需要,则完整在此处.)

但是,当我尝试使用以下代码编译此代码时:

gcc -m64 -std=c99 -pedantic -Wall -Wshadow -Wpointer-arith -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes file_read.c
Run Code Online (Sandbox Code Playgroud)

我收到以下警告:

file_read.c:49:5: warning: implicit declaration of function ‘strtok_r’ [-Wimplicit-function-declaration]
     line = strtok_r(str1, delimiter1, &saveptr1);
     ^
file_read.c:49:10: error: incompatible types when assigning to type ‘char[200]’ from type ‘int’
     line = strtok_r(str1, delimiter1, &saveptr1);
          ^
file_read.c:59:15: error: incompatible types when assigning to type ‘char[200]’ from type ‘int’
       integer = strtok_r(str2, delimiter2, &saveptr2);
               ^
Run Code Online (Sandbox Code Playgroud)

第49和59行对应于strtok_r呼叫.

正如你所看到的,我已经包含string.h在我的文件中(这strtok_r是声明的位置),我仍然得到隐式声明警告strtok_r.

任何有关如何删除警告的见解表示赞赏.

我在ubuntu 14.04 64位桌面上使用gcc 4.8.2.

nos*_*nos 9

strtok_r不是标准的C函数.您通过使用-std=c99编译器标志仅询问了C99 ,因此(glibc)头文件只能使string.h您可以使用标准C99函数.

通过使用-std=gnu99或定义其中一个扩展(在strtok的联机帮助页中显示)来启用扩展,该扩展在包含之前支持strtok_r string.h.例如

#define _GNU_SOURCE
#include <string.h>
Run Code Online (Sandbox Code Playgroud)

请注意,代码也有其他问题, strtok_r返回a char *,但是您尝试将其分配给char数组integer = strtok_r(str2, delimiter2, &saveptr2);.你的integer变量应该是char *

  • 是的,它可能会降低便携性。然而 strtok_r 是由 posix 定义的,所以至少几乎所有类似 unix 的系统都会有它。 (2认同)
  • @ i08in`strtok_r`肯定会降低可移植性,因为它只是一个*nix函数,windows等效于`strtok_s`. (2认同)