c ++中两个'char*'演员之间有什么区别?

kat*_*ang 2 c c++ casting const

我有一个"C"功能

find_register(char *name)
Run Code Online (Sandbox Code Playgroud)

这是从"C++"例程中调用的.第一个提示它的提示是

find_register("%ebx")
Run Code Online (Sandbox Code Playgroud)

它会导致警告

deprecated conversion from string constant to 'char*'
Run Code Online (Sandbox Code Playgroud)

好的,我纠正了

find_register(string("%ebx").c_str())
Run Code Online (Sandbox Code Playgroud)

这会导致错误消息

"invalid conversion from 'const char*' to 'char*'
Run Code Online (Sandbox Code Playgroud)

最后,

find_register((char*)string("%ebx").c_str())
Run Code Online (Sandbox Code Playgroud)

被接受没有错误消息和警告.

我的问题:1.错误信息的可能原因是改变'const char*'的可能性是敞开的.没关系,但在第一种情况下,不太复杂的版本允许相同,并且将字符串常量转换为'char*'是合法但不推荐的转换.背后有更深层次的原因吗?

2. /有什么简单的方法可以做我想要的吗?(对于程序员来说,完美的(对于编译器)代码几乎不可读)

AnT*_*AnT 11

原因在于C++语言的原始根源,早在与C的某些向后兼容性被认为是重要的时候.

在C语言字符串文字中,尽管是不可修改的,但却有类型char [N].出于这个原因,它们可以隐式转换为char *C中的类型.在C++中,字符串文字具有类型const char[N].形式上,const char[N]不能隐含地转换为char *.但由于上述C兼容性原因,原始C++规范(C++ 98)允许将字符串文字隐式转换为char *.此异常仅用于立即字符串文字,作为提供给字符串文字的特殊处理形式.

但最终C兼容性的问题变得不重要,这种特殊处理在C++ 03中被弃用了.所以,这就是编译器告诉你的.在您的find_register("%ebx")调用中,它同意将直接字符串文字转换为char *,但警告您不推荐使用此转换.在C++ 11中,这种隐式转换完全是非法的.

在其他情况下(不是立竿见影的字符串文字)的隐式转换const char [N]const char *char *被禁止的,一直被禁止.这就是你的原因

find_register(string("%ebx").c_str())` 
Run Code Online (Sandbox Code Playgroud)

变体没有编译的机会.

至于解决这个限制...如果您确定find_register(char *name)不会尝试更改指向的数据name(并且您不能只是将find_register参数类型更改为const char *name),那么

find_register(const_cast<char *>("%ebx"))
Run Code Online (Sandbox Code Playgroud)

是一个相当可接受的解决方案(附带适当的评论).当然,如果find_register是修改函数,那么你将不得不做类似的事情

char reg[] = "%ebx";
find_register(reg);
Run Code Online (Sandbox Code Playgroud)