为啥当我使用不同版本的 GCC 时使用 strtok 函数时出现此错误?

     2023-02-21     44

关键词:

【中文标题】为啥当我使用不同版本的 GCC 时使用 strtok 函数时出现此错误?【英文标题】:Why is this error on using strtok function showing when I use a different version of GCC?为什么当我使用不同版本的 GCC 时使用 strtok 函数时出现此错误? 【发布时间】:2020-08-28 23:56:54 【问题描述】:

我有这段 C++ 代码:

const char *Delim = "some text";
char *token;
...
token = strtok('\0', Delim); // error here

错误如下:

invalid conversion from 'char' to 'char*' [-fpermissive]

我在 GCC 5.3 中对此进行了测试,并且成功了。但在 GCC 8.1 中它失败并给了我错误。

我知道我对 char 值进行了硬编码。但是,Delim 变量也是硬编码的。无论 GCC 版本如何,什么是正确的替代品?为什么?

注意:我测试了以下内容以使其编译,但我想进一步了解它

const char *Delim = "some text";
char *str_0 = "\0"; // still receive warning that ISO C++ forbids converting a string constant to 'char*'
car *token;
...
token = strtok(str_0, Delim);

有趣的是,单引号也不起作用:

const char *Delim = "some text";
char *str_0 = '\0'; // fails
car *token;
...
token = strtok(str_0, Delim);

【问题讨论】:

这能回答你的问题吗? Single quotes vs. double quotes in C or C++ 【参考方案1】:

这是因为自 C++11 起,char 表达式 '\0' 不再是 空指针常量(因此不再可转换为指针)。默认情况下,较新的编译器使用新版本的 C++。

您应该将一个实际的空指针(即 nullptr 或过去的 NULL)传递给该参数,而不是 '\0'。过去,您的代码之所以有效,是因为一种奇怪的隐式转换最终被删除。这种转换可能掩盖了对在此处传递空指针的含义的误解(这意味着“请继续上一个标记化会话”,而不是“使用 '\0' 作为分隔符”)。

所以:

token = strtok(nullptr, Delim);

我还建议您使用 -std 标志告诉 GCC 您正在编写哪个版本的 C++。

char *str_0 = "\0"; // still receive warning that ISO C++ forbids converting a string constant to 'char*'

长期以来,人们一直建议不要这样做,近十年来一直是非法的。字符串文字应该存储在const char*,而不是char*。它们是不可变的(常量)。

不管怎样,这个代码变体做了不同的事情;您现在正在标记字符串 str_0,而不是继续标记原始字符串。

最后,我想你可能已经把这些论点倒过来了。 Delim 应该是分隔符列表,而不是输入字符串。如果没有具体的问题示例,很难确定,但"some text" 甚至看起来不像是分隔符列表的 占位符

请查看一些 strtok 文档或您最喜欢的书中有关它的部分,以刷新您对它应该如何使用的记忆。

【讨论】:

另请参阅作为扩展,您的 C++ 库版本是否具有strtok_s。我不知道为什么原来的 strtok 是这样定义的,但是它有几个问题,最值得注意的是它一次只能保存一组状态,所以如果你想标记多个字符串,你需要小心。

为啥 gcc -O1 的行为与 gcc -O0 + 选项不同

】为啥gcc-O1的行为与gcc-O0+选项不同【英文标题】:Whydoesgcc-O1behavedifferentlythangcc-O0+options为什么gcc-O1的行为与gcc-O0+选项不同【发布时间】:2015-11-2200:10:00【问题描述】:鉴于gcc文档(https://gcc.gnu.org/onlinedocs/gcc-5.2.0/gcc.pdf)指定-O1是-O... 查看详情

为啥过滤时使用相同的字段会导致不同的执行时间? (不同的索引用法)

】为啥过滤时使用相同的字段会导致不同的执行时间?(不同的索引用法)【英文标题】:Whyusingsamefieldwhenfilteringcausedifferentexecutiontime?(differentindexusage)为什么过滤时使用相同的字段会导致不同的执行时间?(不同的索引用法)... 查看详情

使用与使用不同 gcc 版本编译的库不同的 gcc 编译应用程序

】使用与使用不同gcc版本编译的库不同的gcc编译应用程序【英文标题】:compileapplicationwithgccthatisdifferentfromlibrarycompiledwithdifferentgccversion【发布时间】:2015-04-1506:28:01【问题描述】:我想用gcc4.7编译一个c++应用程序,这个应用程... 查看详情

gcc的替换,很有用

摘要:Ubuntu系统使用的gcc版本随着发布版本的不同而不同,在编译android系统时不同的版本推荐用不同的gcc去编译,那么可不可以改变系统的gcc来适应android编译环境的需求呢?答案是可以的。Ubuntu系统使用的gcc版本随着发布版本的... 查看详情

链接使用不同版本的 gcc 编译的库

】链接使用不同版本的gcc编译的库【英文标题】:Linkinglibrariescompiledwithdifferentversionofgcc【发布时间】:2013-01-2916:06:36【问题描述】:我有一个C++软件(Borealis流引擎),该软件已编译并与GCC3.3.6一起使用(我无法使其与较新版本... 查看详情

当我的应用程序使用不同的 appsettings 文件时,为啥 AspNetCore Identity 脚手架不会加载其关联的 CSS 和 JS 文件?

】当我的应用程序使用不同的appsettings文件时,为啥AspNetCoreIdentity脚手架不会加载其关联的CSS和JS文件?【英文标题】:WhywilltheAspNetCoreIdentityscaffoldingnotloaditsassociatedCSSandJSfileswhenmyappusesadifferentappsettingsfile?当我的应用程序使用不... 查看详情

链接使用不同版本的 GCC 构建的目标文件

】链接使用不同版本的GCC构建的目标文件【英文标题】:LinkingobjectfilesbuiltusingdifferentversionsofGCC【发布时间】:2011-01-1710:26:26【问题描述】:我对使用现代版本的GCC4.4.x/4.5.x构建C++库存在一些兼容性问题,其中客户端使用旧版本... 查看详情

为啥我们需要整合不同版本的包?

】为啥我们需要整合不同版本的包?【英文标题】:whyweneedtoconsolidatepackageswithdifferentversions?为什么我们需要整合不同版本的包?【发布时间】:2022-01-2405:33:41【问题描述】:假设我有一个包含两个项目的解决方案。ProjectA使用版... 查看详情

makefile 中的多个 gcc 版本

...】:2015-12-1307:39:55【问题描述】:在我的Makefile我有CC=g++当我执行mgrepgcc时,我列出了几个版本,例如:gnu/gcc/4.2.1gnu/gcc/4.7.3等等我可以加载模块来更改我的gcc版本。现在假设我想在不同的makefile中同时使用多个版本,我该怎么做... 查看详情

使用混合版本的 gcc 的 Makefile

...:我刚刚在我的OSX(雪豹)机器上通过brew安装了gcc4.8。当我运行make时,它​​使用旧版本的g++作为目标文件和新版本的可执行文件。$makeg++-c-omyprogram.omyprogram.ccg++-4.8-g-Wall-omyprogra 查看详情

GCC 使用旧版本的 C++

...:CentOS6.4代码::Blocks10.05GCC4.4.7这些是yum提供的最新版本。当我学习本教程时,我注意到它所说的很多内容对我不起作用。例如,我不能在字符串前面加上“u”、“U”、“L”等。此外,“nullpt 查看详情

为啥使用 Visual Studio 而不是 GCC 编译时没有错误?

】为啥使用VisualStudio而不是GCC编译时没有错误?【英文标题】:WhydoesthiscompilewithoutanerrorwithVisualStudioandnotGCC?为什么使用VisualStudio而不是GCC编译时没有错误?【发布时间】:2015-10-1313:22:23【问题描述】:您知道为什么使用VisualStudi... 查看详情

为啥在默认 4.8 时 b2 使用 gcc4.6 构建?

】为啥在默认4.8时b2使用gcc4.6构建?【英文标题】:Whydoesb2buildwithgcc4.6when4.8isdefault?为什么在默认4.8时b2使用gcc4.6构建?【发布时间】:2014-04-1115:08:59【问题描述】:在构建自定义Boost.Python项目时,我遇到了由于缺乏对gcc-4.6的c++11... 查看详情

如何更改 GCC Xcode 使用的版本?

...三方查看器。我已经完成了所有设置,现在我在Xcode中。当我单击BuildAndRun按钮时,我在稍作说明GCC4.2与MacOSX10.4SDK不兼容 查看详情

为啥使用字符串初始化没有 const 的数组时 gcc 不给出警告?

】为啥使用字符串初始化没有const的数组时gcc不给出警告?【英文标题】:Whygccdoesnotgiveawarningwhenyouinitializeanarraywithoutconstwithstrings?为什么使用字符串初始化没有const的数组时gcc不给出警告?【发布时间】:2016-10-0922:54:40【问题描... 查看详情

为啥 NVM 使用不正确的 Python 版本?

】为啥NVM使用不正确的Python版本?【英文标题】:WhydoesNVMusetheincorrectversionofPython?为什么NVM使用不正确的Python版本?【发布时间】:2020-05-1903:52:04【问题描述】:我在使用node-gyp包时遇到了一些问题,我相信这是因为我需要使用py... 查看详情

在 Windows 上使用 Rtools 中包含的不同 gcc 版本和 Rcpp

】在Windows上使用Rtools中包含的不同gcc版本和Rcpp【英文标题】:UsingadifferentgccversionfromthatincludedwithRtoolswithRcpponWindows【发布时间】:2014-08-2221:31:47【问题描述】:在我开始更新gcc之前,有没有人真正尝试过这个,他们是否可以确... 查看详情

使用不同 Ifc 版本的相同代码的不同结果

...rentIfcversions【发布时间】:2021-05-2708:09:52【问题描述】:当我运行下面的代码以使用Ifc4文件和Xbim.Ifc4接口获取ifcWindowArea数量时,它可以完美运行。但是,当我尝试在与Ifc2x3文件相同的架构上运行并使用Xbim.Ifc2x3接口时,它无法... 查看详情