转载自 Vimer的程序世界 [ http://www.vimer.cn ]

最近遇到了几个C++问题,在这里总结一下,希望可以避免其他朋友犯同样的错误。
一.隐式转换引发的血案
我们直接来看一段代码:

1
            2
            3
            4
            5
            6
            7
            8
            9
            10
            11
            12
            13
            14
            15
            16
            17
            18
            19
            20
            21
            22
            23
            24
            25
            
#include <iostream>
            #include <string>
            #include <vector>
            #include <set>
            #include <map>
            using namespace std;
             
            void a(bool input)
            {
            cout<<"I amd first"<<endl;
            cout<<input<<endl;
            }
             
            void a(const string &input)
            {
            cout<<"I amd second"<<endl;
            cout<<input<<endl;
            }
             
            int main(int argc,char **argv)
            {
            a("str");  // 是调用第二个a函数吗?
            a(string("str"));
            return 0;
            }

运行结果会是啥呢?好吧,可能让你失望了,结果如下:

I amd first
1
I amd second
str

char*类型的"str"居然被隐式转化成了bool类型,我简单做了一下测试:

1
            2
            3
            4
            5
            6
            7
            8
            9
            10
            11
            12
            13
            14
            15
            16
            17
            
#include <string>
            #include <vector>
            #include <set>
            #include <map>
            using namespace std;
            int main(int argc, const char *argv[])
            {
            int a = 1;
            char * b = "wo";
            float c = 1.1;
             
            bool x;
            x = a;
            x = b;
            x = c;
            return 0;
            }

int,char*,float确实都可以隐式转化成bool而不会有任何警告,导致出现问题很不容易发现,这里在重载函数的时候确实需要万分注意。

二.字节对齐引发的惨案
先来介绍一下背景,我这里有个server,会在运行时调用一个so,正常情况下都一切正常,但是在引用了一个第三方给的头文件之后,在调用so的一个函数的时候就会core掉。
百思不得其解之下,去看了一下那个第三方头文件的定义:

1
            2
            3
            4
            5
            6
            7
            
#ifndef HEADER_OPENAPILOG_PROTOCOL
            #define HEADER_OPENAPILOG_PROTOCOL
            #pragma pack(1)
             
            //一些结构体定义
             
            #endif

只调用了#pragma pack(1)却没有在文件结束时调用#pragma pack()!而我的主调server虽然重新编译了,但是so却没有重新编译,导致其共用的结构体一个做了字节对齐,一个没有做。
修改成如下即正常:

1
            2
            3
            4
            5
            6
            7
            8
            
#ifndef HEADER_OPENAPILOG_PROTOCOL
            #define HEADER_OPENAPILOG_PROTOCOL
            #pragma pack(1)
             
            //一些结构体定义
             
            #pragma pack()
            #endif

每个复杂的问题背后都有一个简单的原因,OK,就这样。

原创文章,版权所有。转载请注明:转载自Vimer的程序世界 [ http://www.vimer.cn ]

本文链接地址: http://www.vimer.cn/2011/01/%e6%9c%80%e8%bf%91%e9%81%87%e5%88%b0%e7%9a%84%e5%87%a0%e4%b8%aac%e9%97%ae%e9%a2%98%e9%9a%90%e5%bc%8f%e8%bd%ac%e5%8c%96%ef%bc%8c%e5%ad%97%e8%8a%82%e5%af%b9%e9%bd%90.html