Dev C++ strtok_s throws [Warning] assignment makes pointer from integer without a cast
Dev C++ strtok_s throws [Warning] assignment makes pointer from integer without a cast
我有以下程序:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char *tp = NULL, *cp = NULL, *next_token = NULL;
char TokenListe[] = "Hello,I Am,1";
tp = strtok_s(TokenListe, ", ", &next_token);
printf(tp);
return 0;
}
当我用 Visual Studio 2015 编译它时,它会编译,没有任何警告。
但是当我用 Dev C++ 5.11 编译它时,我在第 10 行收到以下警告:
[Warning] assignment makes pointer from integer without a cast
是否有解决该警告的解决方案?
如果 Dev C++ 没有 non-standard strtok_s,在 C 中它将被隐式声明,并假定为 return 整数。
注意:strtok_s 在标准中是 ,但作为 "optional extension",根据(我的免费草稿副本)C11 标准。
您还应该启用其他警告,例如函数隐式声明的警告。
如果 Dev C++ 确实包含 strtok_s 的实现并与它链接,您自己声明它可能会起作用。但更好的选择是找到正确的头文件或编译器标志来声明它(如果存在任何此类选项)。查阅文档。
但是请注意,正如 Michael Walz 评论的那样,C11 标准中的 strtok_s 和 Microsoft 的 strtok_s 是不同的,并且没有相同的参数!不知道Dev C++实现的是哪个版本
根据 @thomas-padron-mccarthy 的回答,我可以通过在头文件中声明 strtok_s 函数来解决我的问题。
extern char* strtok_s(char*, char*, char**);
从 C11 开始,strtok_s
现在是标准 C,可选 "bounds-checking interface" 的一部分(附件 K)。编译器不需要支持它。
但如果他们这样做,格式是这样的 (C11 K.3.7.3.1):
#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h>
char *strtok_s(char * restrict s1,
rsize_t * restrict s1max,
const char * restrict s2,
char ** restrict ptr);
任何其他格式都是 non-standard 垃圾,不应使用,包括 Microsoft strtok_s。
Dev C++ 不再维护,因此只包含一个非常旧的 gcc 版本。它不支持 C11,但据我所知,还没有更新版本的 gcc + 库支持 C11 bounds-checking 接口。 Visual Studio 是一个 non-conforming 编译器,不能用于编译标准 C。一般来说,我建议不要使用这两个编译器,而是更新到新版本的 gcc(例如 Codeblocks with Mingw).
总结:strtok_s
不能以合理的方式使用。请改用 strtok
。只需确保涉及的所有缓冲区都足够大并且不会溢出。如果是 multi-threaded 程序,根本不要使用 strtok
。
我有以下程序:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char *tp = NULL, *cp = NULL, *next_token = NULL;
char TokenListe[] = "Hello,I Am,1";
tp = strtok_s(TokenListe, ", ", &next_token);
printf(tp);
return 0;
}
当我用 Visual Studio 2015 编译它时,它会编译,没有任何警告。 但是当我用 Dev C++ 5.11 编译它时,我在第 10 行收到以下警告:
[Warning] assignment makes pointer from integer without a cast
是否有解决该警告的解决方案?
如果 Dev C++ 没有 non-standard strtok_s,在 C 中它将被隐式声明,并假定为 return 整数。
注意:strtok_s 在标准中是 ,但作为 "optional extension",根据(我的免费草稿副本)C11 标准。
您还应该启用其他警告,例如函数隐式声明的警告。
如果 Dev C++ 确实包含 strtok_s 的实现并与它链接,您自己声明它可能会起作用。但更好的选择是找到正确的头文件或编译器标志来声明它(如果存在任何此类选项)。查阅文档。
但是请注意,正如 Michael Walz 评论的那样,C11 标准中的 strtok_s 和 Microsoft 的 strtok_s 是不同的,并且没有相同的参数!不知道Dev C++实现的是哪个版本
根据 @thomas-padron-mccarthy 的回答,我可以通过在头文件中声明 strtok_s 函数来解决我的问题。
extern char* strtok_s(char*, char*, char**);
从 C11 开始,strtok_s
现在是标准 C,可选 "bounds-checking interface" 的一部分(附件 K)。编译器不需要支持它。
但如果他们这样做,格式是这样的 (C11 K.3.7.3.1):
#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h>
char *strtok_s(char * restrict s1,
rsize_t * restrict s1max,
const char * restrict s2,
char ** restrict ptr);
任何其他格式都是 non-standard 垃圾,不应使用,包括 Microsoft strtok_s。
Dev C++ 不再维护,因此只包含一个非常旧的 gcc 版本。它不支持 C11,但据我所知,还没有更新版本的 gcc + 库支持 C11 bounds-checking 接口。 Visual Studio 是一个 non-conforming 编译器,不能用于编译标准 C。一般来说,我建议不要使用这两个编译器,而是更新到新版本的 gcc(例如 Codeblocks with Mingw).
总结:strtok_s
不能以合理的方式使用。请改用 strtok
。只需确保涉及的所有缓冲区都足够大并且不会溢出。如果是 multi-threaded 程序,根本不要使用 strtok
。