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

vs2010/ gcc 针对 return 话语的编译优化、警告方式

2013-07-04 
vs2010/ gcc 针对 return 语句的编译优化、警告方式如有一函数 :int GetThreeSeven(){return 333 + 444}

vs2010/ gcc 针对 return 语句的编译优化、警告方式
如有一函数 :
int GetThreeSeven()
{
     return 333 ; + 444;
}

能够编译通过, 不报错不警告, 估计是被编译优化了 return 语句 后面的 + 444 ; 部分;
但从函数名 知道我需要的 预期结果是 返回 777; 虽然这是 我作为程序员自己的问题, 但vs2010 编译器会 gcc 有没有什么编译选项 可以“禁止return 完整语句后面多余操作”的 设置 , 
例如 #pragram (error : xxx)

我手头资料上 找不到相关解决方案。
[解决办法]
这类问题应该是属于lint检测的范畴,而不是编译器。

引用:
我也明白这是 合法的语句;但就是我的这种“错误的编码方式”使代码出bug了; 我主要是想让编译器能否再“智能”些, 例如 有warning 可以提示 “并不是所有分支都有 返回值”等。 以下两方面是我想提出这个问题的 考虑出发点:

1.编码规范; 想ThreeSeven() 函数就这么间断的语句,但 return 内包含有操作, 而非仅仅是返回所要值; 或许effective c++ 上有什么“箴言”可以指导指导, 能够在“心法”上尽量杜绝这种问题。

2.编译器级别防止 低级错误, 好像 return 语句完毕后, 还有其他操作 例如 +444; 虽然这语句合法, 但编译器并没有能够 “防止”我继续编写 “合法的”没有代码吧假如, 
return 333 ; + 444
  + 555
  + iOthers
  + ...

很明显, 我的意图并不是仅仅 是一个 333 作为结果。

[解决办法]
跟优化没有关系。
1:    #include <stdio.h>
2:    int GetThreeSeven()
3:    {
00401000 55                   push        ebp
00401001 8B EC                mov         ebp,esp
00401003 83 EC 40             sub         esp,40h
00401006 53                   push        ebx
00401007 56                   push        esi
00401008 57                   push        edi
4:          return 333 ; + 444;
00401009 B8 4D 01 00 00       mov         eax,14Dh
5:    }
0040100E 5F                   pop         edi
0040100F 5E                   pop         esi
00401010 5B                   pop         ebx


00401011 8B E5                mov         esp,ebp
00401013 5D                   pop         ebp
00401014 C3                   ret
6:    int main() {
00401020 55                   push        ebp
00401021 8B EC                mov         ebp,esp
00401023 83 EC 40             sub         esp,40h
00401026 53                   push        ebx
00401027 56                   push        esi
00401028 57                   push        edi
7:        printf("%d\n",GetThreeSeven());
00401029 E8 D2 FF FF FF       call        GetThreeSeven (00401000)
0040102E 50                   push        eax
0040102F 68 A4 20 40 00       push        offset string "%d\n" (004020a4)
00401034 FF 15 00 20 40 00    call        dword ptr [__imp__printf (00402000)]
0040103A 83 C4 08             add         esp,8
8:        return 0;
0040103D 33 C0                xor         eax,eax
9:    }
0040103F 5F                   pop         edi
00401040 5E                   pop         esi
00401041 5B                   pop         ebx
00401042 8B E5                mov         esp,ebp
00401044 5D                   pop         ebp
00401045 C3                   ret



1:    #include <stdio.h>
2:    int GetThreeSeven()
3:    {
00401000 55                   push        ebp
00401001 8B EC                mov         ebp,esp
00401003 83 EC 40             sub         esp,40h
00401006 53                   push        ebx
00401007 56                   push        esi
00401008 57                   push        edi
4:          return 333 ; + 444;
00401009 B8 4D 01 00 00       mov         eax,14Dh
5:    }
0040100E 5F                   pop         edi
0040100F 5E                   pop         esi
00401010 5B                   pop         ebx
00401011 8B E5                mov         esp,ebp
00401013 5D                   pop         ebp
00401014 C3                   ret
6:    int main() {
00401020 55                   push        ebp
00401021 8B EC                mov         ebp,esp
00401023 83 EC 40             sub         esp,40h
00401026 53                   push        ebx
00401027 56                   push        esi
00401028 57                   push        edi
7:        printf("%d\n",GetThreeSeven());
00401029 E8 D2 FF FF FF       call        GetThreeSeven (00401000)


0040102E 50                   push        eax
0040102F 68 A4 20 40 00       push        offset string "%d\n" (004020a4)
00401034 FF 15 00 20 40 00    call        dword ptr [__imp__printf (00402000)]
0040103A 83 C4 08             add         esp,8
8:        return 0;
0040103D 33 C0                xor         eax,eax
9:    }
0040103F 5F                   pop         edi
00401040 5E                   pop         esi
00401041 5B                   pop         ebx
00401042 8B E5                mov         esp,ebp
00401044 5D                   pop         ebp
00401045 C3                   ret


[解决办法]
c/c++里可以嵌汇编,还有goto。谁能保证不会有人故意跳到return后面
[解决办法]
做不到的 
因为 有时候 你会写这样的代码 

if(GetError())
        return Error;
//TODO:
        /*
                各种其他代码
        */

就是说 你的return 语句 后面有其他语句的情况是完全正常的逻辑 
编译器怎么可以随便给警告

热点排行