【发布时间】:2013-02-09 08:50:34
【问题描述】:
这是一个代码 -
1 int main(int argc, char *argv[])
2 {
3 signed char S, *psc;
4 unsigned char U, *pusc;
5 char C, *pc;
6
7 C = S;
8 C = U;
9
10 pc = psc;
11 pc = pusc;
12
13 return 0;
14 }
$ gcc test.cpp -o a
test.cpp: In function ‘int main(int, char**)’:
test.cpp:10:7: error: invalid conversion from ‘signed char*’ to ‘char*’ [-fpermissive]
test.cpp:11:7: error: invalid conversion from ‘unsigned char*’ to ‘char*’ [-fpermissive]
这是在 Intel 32 位机器上的 Ubuntu 12.10 上的 gcc 版本 4.6.3 上编译的。
考虑到 char 类型在 x86 上是 unsigned char。 -
如果第 7 行和第 8 行对非指针类型的赋值正常,为什么第 10 行和第 11 行的指针类型会抛出错误?
另外,C = U 是否应该在不需要强制转换的情况下成功?
【问题讨论】:
-
你熟悉"strict aliasing"这个词吗?
-
阅读那些东西......
-
-fpermissive可以帮助你,忽略这个烦恼。有时您可能想再次暂时删除该标记,并查看您的编译器是否在您的项目中发现了其他您应该担心的错误。 -
另外请注意,如果您不想使用编译器标志,您可以通过使用
void*s 来做到这一点。例如void* pc;将允许这种情况发生,而要取消引用您必须执行*((char*)pc)。或者,您可以只使用中间人技术,而不必在取消引用时为(char*)pc操心,例如void* pc_; pc_ = pusc; pc = pc_;,代价是堆栈中不必要的sizeof(ptr)字节。
标签: c++ char signed unsigned-char