【发布时间】:2020-10-10 02:29:28
【问题描述】:
以这段代码为例:
const char *s;
char *t = s;
这会发出这个:warning: assignment discards 'const' qualifier from pointer target type
只需添加一个强制转换,就可以很容易地使编译器静音:
char *t = (char*)s;
你可以对常规变量做类似的事情,而不仅仅是指针,它不仅适用于 const 限定符。您基本上可以从任何类型转换为任何类型,即使其中一些转换会造成麻烦。
我还读到你永远不应该转换 malloc,因为 void 指针的转换总是安全的。
但铸造实际上做了什么?除了阻止编译器发出警告之外,它是否还有其他作用。什么时候真正需要显式强制转换?
澄清:
我在这里谈论作业。不是double res = (double)a / b 之类的东西。在那种情况下,我知道强制转换的作用,在这种情况下,我们可以轻松地摆脱显式强制转换,转而使用如下的隐式强制转换:double c = a; double res = c/b; 或只是 double res = (1.0 * a) / b
【问题讨论】:
-
我不确定是否存在不能使用变量的情况,但它通常会降低
(double)a / b等表达式的可读性以避免整数除法。你问的是这个吗? -
@Ry- 我会澄清的。一秒。
-
另外,这些警告似乎是关于不符合标准的代码,并且允许是错误:stackoverflow.com/questions/36828742/…
-
底线是演员通过告诉编译器
s是char*类型而不是const char*来掩盖警告,因此它允许在没有警告的情况下分配给t-- 但是 -- (总是有一个但是...)现在t指向s,但是...t是可变的,任何接收t的函数都可以有效地假设它指向可变内存——这是不是这种情况,如果有东西试图修改t指向的内存(它恰好是字符串文字等)——BAM SEGFAULT。本质上,强制转换使编译器对t的类型成为谎言。 -
这是一个有趣的问题。有一些转换实际上改变了编译器生成的代码,比如
(double)a/b变体,还有一些只允许编译器接受它会抱怨的代码。我不确定“在哪里需要显式转换”的问题是否有一句话的答案。