【发布时间】:2014-07-20 14:24:18
【问题描述】:
我有以下代码来标记包含由\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;
}
}
}
}
(这里只包含了相关功能,完整的,如果需要的话,是here。)
但是,当我尝试使用以下代码编译此代码时:
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选项提供它。当然,假设您的实现支持它,我当然希望您的实现支持它。 -
@WhozCraig:我在
strtok_r的手册页中没有看到使用#define _POSIX_C_SOURCE,我怎么知道我应该这样做? -
查看man page 中的功能测试宏要求。我假设你在你的平台上使用 glibc。还有其他方法可以吸收它,其中一些可能是在您设置标准开关时默认预定义的(例如,-std=c99 可能不会打开它,而 -std=c11 可能会。have' t 测试过,但我不会感到惊讶)。
-
@WhozCraig:谢谢!您的评论以及 nos 的回答有助于解决这个问题。非常感谢! :)
标签: c string tokenize strtok gcc-warning