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

关于const的一个有关问题

2013-08-24 
关于const的一个问题图2:minGW编译的输出constCC++[解决办法]void constProblem(void)与常量折叠有关, 是

关于const的一个问题

图2:minGW编译的输出
关于const的一个有关问题 const C C++
[解决办法]
void constProblem(void)与常量折叠有关, 是优化的结果。
void constProblem2(void)是认识错误。 


//表示不能通过num修改num_pre,不表示num_pre是只读的。 
const int &num = num_pre;




你一旦使用类型强制转换, 表示你已经谢绝编译器为你的程序安全出力并且同意为此承担所有后果。 
[解决办法]
关于常量折叠的例子(vc 2012,release)。注意, 常量折叠是一种优化,不是必然发生的。

int main()
{
01151250  push        ebp  
01151251  mov         ebp,esp  
01151253  push        ecx  
//常量折叠
{
int const i = 5;
*(int*)&i = 6;
printf("%d\n", i); 
01151254  push        5 
01151256  push        1160334h //"d\n"的地址 
0115125B  mov         dword ptr [i],6 // *(int*)&i = 6
01151262  call        printf (01152013h) //执行printf("%d\n", 5) ,这就是常量折叠
//此时i虽然为6,但没有读取i的值。理由是:编译器认为, i是只读的,所以他相信i的值始终为1
//出现问题的原因是你"出尔反尔"了,没有让i的值只读
printf("%d\n", *(int volatile*)&i);
01151267  mov         eax,dword ptr [i] //此时i为6  
0115126A  push        eax  
0115126B  push        1160334h  //"d\n"的地址
01151270  call        printf (01152013h) //执行printf("%d\n", i),此时i为6 
01151275  add         esp,10h  
}
return 0;
01151278  xor         eax,eax  
}

[解决办法]
引用:
Quote: 引用:

const用于提高程序的健壮性,你这样int *pointer=(int *)&num间接的修改当然是可以的,但是没有意义。


我觉得通过类型转换可以修改num的值。
但是从输出来看,num的值并没有改变,还是1。


任何尝试修改const 变量,有未定义行为 .google:未定义行为 .
[解决办法]
#pragma comment(linker,"/SECTION:.rdata,RW")
//加这句可以让常量区可写,后果自负!

不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!

热点排行