我有以下代码用于将包含以
我收到以下警告提示:
\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;
}
}
}
}
这里只包含相关函数,完整的代码如有需要可以在这里查看。
然而,当我尝试使用以下命令编译这段代码时:
gcc -m64 -std=c99 -pedantic -Wall -Wshadow -Wpointer-arith -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes file_read.c
我收到以下警告提示:
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);
^
第49和59行对应strtok_r
调用。
你可以看到,在我的文件中包含了string.h
(其中声明了strtok_r
),但我仍然收到了有关strtok_r
的隐式声明警告。
如何消除警告,请提供任何见解。
我在ubuntu 14.04 64位桌面上使用gcc 4.8.2。
strtok_r
应该使用string.h
正确引入,但它是 POSIX-2001 的特性,你需要确保它被包含。要么在包含任何标准头文件之前加上#define _POSIX_C_SOURCE 200112L
,要么通过编译器命令行开关的-D
选项提供它。当然,这假设你的实现支持它,并且我当然希望你的实现支持它。 - WhozCraigstrtok_r
的手册页面中没有看到使用#define _POSIX_C_SOURCE
,那我怎么知道我应该这样做呢? - jobin