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