首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++关于void*的有关问题

2013-02-04 
C++关于void*的问题这段代码编译出现了下面的错误:#include iostreamusing namespace stdint main(){vo

C++关于void*的问题
这段代码编译出现了下面的错误:

#include <iostream>

using namespace std;

int main()
{
    void* pVoid;
    (char*) pVoid++;
    (char*) pVoid += 2;
    return 0;
}


/home/chase/codes/C++/sometest/test2/main.cpp|8|错误: ISO C++ 不允许对类型为‘void*’的指针自增 [-fpermissive]|
/home/chase/codes/C++/sometest/test2/main.cpp|9|错误: 赋值运算的左操作数必须是左值|
||=== Build finished: 2 errors, 0 warnings ===|


我已经对void*类型的pVoid进行了强制转换,为什么还是不能进行自增和赋值操作?


[解决办法]
按照ANSI(American National Standards Institute)标准,不能对void指针进行算法操作,即下列操作都是不合法的:

void * pvoid;

pvoid++; //ANSI:错误

//ANSI标准之所以这样认定,是因为它坚持:进行算法操作的指针必须是确定知道其指向数据类型大小的。

[解决办法]
void*不算扩展是没法++,转换以后是也右值不是左值,内建++需要左值,语义错误编译当然过不去。
这么个基本问题支支吾吾半天除了10L就没个靠谱的,CSDN没人了?

还有LZ,你问之前可以确定一下你是不是理解了错误是什么意思,明明都用中文说出来了。

引用:
就算编译器支持,这段语法也是有错误的。
++的优先级高于强制转换。
应该这么写:
((char*)pVoid)++;

引用:大名鼎鼎的GNU(GNU's Not Unix的缩写)则不这么认定,它指定void *的算法操作与char *一致。

因此下列语句在GNU编译器中皆正确:

pvoid++; //GN……

麻烦你自己试试再说。
转换了也是右值,内建++需要左值。
还有LZ,先试试看懂错误是什么意思把。缺搜索关键字么?

[解决办法]
gcc file.c是正确的
g++ file.cpp是错误的。
引用:
大名鼎鼎的GNU(GNU's Not Unix的缩写)则不这么认定,它指定void *的算法操作与char *一致。

因此下列语句在GNU编译器中皆正确:

pvoid++; //GNU:正确

热点排行