最近遇到了几个C++问题,在这里总结一下,希望可以避免其他朋友犯同样的错误。
一.隐式转换引发的血案
我们直接来看一段代码:
#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类型,我简单做了一下测试:#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掉。
百思不得其解之下,去看了一下那个第三方头文件的定义:
#ifndef HEADER_OPENAPILOG_PROTOCOL
#define HEADER_OPENAPILOG_PROTOCOL
#pragma pack(1)
//一些结构体定义
#endif
只调用了#pragma pack(1)却没有在文件结束时调用#pragma pack()!而我的主调server虽然重新编译了,但是so却没有重新编译,导致其共用的结构体一个做了字节对齐,一个没有做。
修改成如下即正常:
#ifndef HEADER_OPENAPILOG_PROTOCOL
#define HEADER_OPENAPILOG_PROTOCOL
#pragma pack(1)
//一些结构体定义
#pragma pack()
#endif
每个复杂的问题背后都有一个简单的原因,OK,就这样。