栀子博客 栀子花驿站

栀子博客 栀子花驿站--栀子博客主要关注移动互联网、云计算、虚拟化、信息安全、软件体系架构、操作系统内核、C/C++、Windows、Linux等相关产品与技术

« Anti-Screen Capture(Prevent Screen Captures)截屏与反截屏千万不要把 bool 设计成函数参数 »

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

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

更多

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

Search

网站分类

热文排行

最新评论及回复

最近发表

Powered By Z-Blog 1.8 Walle Build 100427

栀子花驿站 zhizihua.com . Some Rights Reserved.
陕ICP备11009591号