首页 / 知识
关于指针:为什么不能在C语言中将’char **’转换为’const char * const *’?
2023-04-16 06:46:00

Why can't I convert 'char**' to a 'const char* const*' in C?以下代码段(正确)在C中给出了警告,并在C ++中给出了错误(分别使用经版本3.4.5和4.2.1测试的gcc和g ++; MSVC似乎无关紧要):
我可以理解并接受。
但是,在纯C语言中,更正后的版本(使用const char * const *)仍然发出警告,我不明白为什么。
澄清:
我想在char **上调用它,参数的正确类型是什么? 几年前,我遇到了同样的问题,这让我无休止。
C中的规则用更简单的方式表示(即,它们未列出将 最后,这只是C标准中的问题。我希望下一个标准(或技术报告)能解决这个问题。 为了被认为是兼容的,源指针应该在前向间接级别中为const。 因此,这将在GCC中向您发出警告:
但这不会:
另外,您可以强制转换:
您将需要使用相同的强制转换来调用函数f()。 据我所知,在这种情况下无法进行隐式转换(C ++中除外)。
您已经确定了问题-此代码不是const正确的。"正确的常量"意味着,除了
如声明的那样, 如果不确定为什么发布的代码不正确,请考虑以下代码,该代码与HappyDude的代码仅稍有不同:
非
最初声明为
在某些编译器上,这将打印 编辑补充:
HappyDude:您的评论很对。 C语言或您使用的C编译器对待 这很烦人,但是如果您愿意添加另一级别的重定向,则通常可以执行以下操作以向下推入指针到指针:
它的含义略有不同,但是通常是可行的,并且不使用强制转换。 我很确定const关键字并不意味着数据不能被更改/是恒定的,只是数据将被视为只读。考虑一下:
这是有效的代码。 volatile和const如何共存?简单。 volatile告诉编译器在使用数据时始终读取内存,而const告诉编译器在尝试使用serial_port指针写入内存时创建错误。 const是否有助于编译器的优化器?一点都不。由于可以通过强制转换将常量添加到数据中或从数据中删除常量,因此编译器无法确定const数据是否确实是常量(因为强制转换可以在其他转换单元中完成)。在C ++中,您还可以使用mutable关键字使事情进一步复杂化。
尝试写入真正只读的内存(例如ROM)时会发生什么,可能根本没有在标准中定义。 至少在MSVC 14(VS2k5)和g ++ 3.3.3上将char **隐式转换为const char * const *时,我无法出错。 GCC 3.3.3发出警告,我不确定这是否正确。 test.c的:
以C代码编译的输出:cl / TC / W4 / Wp64 test.c
以C ++代码编译的输出:cl / TP / W4 / Wp64 test.c
使用gcc输出:gcc -Wall test.c
使用g ++输出:g ++ -Wall test.C 没有输出 |
最新内容
相关内容
linux命令行设置语言?
linux命令行设置语言?,系统,管理,环境,国家,工具,电脑,软件,文化,底部,语言,linux命令行下怎样改变语言1、将内容改为:LANG=zh_CN.UTF-8LANGUAGlinux显示错误命令?
linux显示错误命令?,信息,系统,电脑,状态,时间,环境,命令,搜狐,密码,异常,虚拟机里怎么开始linux系统,打startx命令提示错误1、第一种:这个问题linux退出错误命令的?
linux退出错误命令的?,系统,电脑,环境,命令,位置,管理,工具,设备,终端,进程,Linux命令格式错误出现大于号怎么退出1、ctrl+c,终止当前运行命令linux使用命令改语言?
linux使用命令改语言?,系统,工作,管理,电脑,设备,字符集,中文,命令,语言,虚拟机,请问linux虚拟机装好以后怎么把英文改成中文?1、vmware设置中c语言写linux命令?
c语言写linux命令?,系统,工具,代码,智能,工作,环境,情况,位置,命令,文件,如何在C语言编程中调用linux系统终端下的命令1、C语言有一个system函linux没有该命令错误?
linux没有该命令错误?,系统,第一,环境,命令,分析,软件,异常,文件,目录,空格,不知道为什么在linux命令行下输入一些命令怎么都显示没有找到?1、linux汇编语言命令?
linux汇编语言命令?,系统,地址,代码,数据,网络,平台,平均,位置,灵活,工作,汇编语言指令的基本格式是什么1、有以下几种基本格式:标号,又称为指令linux汇编语言命令?
linux汇编语言命令?,系统,地址,代码,数据,网络,平台,平均,位置,灵活,工作,汇编语言指令的基本格式是什么1、有以下几种基本格式:标号,又称为指令linux命令错误代码?
linux命令错误代码?,系统,密码,电脑,网络,手机,网址,软件,代码,设备,老板,Linux管理常见错误1、检查权限:使用文件浏览器和终端,检查文件的访问linux命令是什么语言?
linux命令是什么语言?,系统,环境,代码,传播,管理,语言,操作系统,源码,自由,部分,dos和linux的命令行里面用的是什么语言?1、DOS/Windows/Linuxlinux改语言命令行?
linux改语言命令行?,系统,环境,工具,密码,概念,地方,软件,通信,管理,国际,linux命令行下怎样改变语言将内容改为:LANG=zh_CN.UTF-8LANGUAGE=zh_linux命令行c语言?
linux命令行c语言?,代码,系统,工具,环境,工作,保险,发行,命令,文件,终端,linux终端下如何进行C语言编译1、在Linux下面,如果要编译一个C语言源