技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 其他 --> 最近遇到的几个C++问题(隐式转化,字节对齐)

最近遇到的几个C++问题(隐式转化,字节对齐)

浏览:1782次  出处信息

    最近遇到了几个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,就这样。

QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1