IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

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

Vimer 2011-01-19 22:22:52 累计浏览 2,217 次
本机暂存

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

原图已失效

同分类推荐文章

  1. 科技爱好者周刊(第 401 期):如何赚到10亿美元 (2026-06-26 08:05:38)
  2. 如何做决策 - 从 Go 的一个 issue 说起 (2026-06-26 08:00:00)
  3. Seven Player:Windows上播放115网盘视频的增强工具 (2026-06-09 00:06:47)

查看更多 开发者 文章 →

建议继续学习

  1. 如何学好C++语言 (累计阅读 10,449)
  2. Emacs配置C/C++-mode的代码智能提示和自动补全 (累计阅读 10,412)
  3. colortail,让 tail 命令绚丽起来 (累计阅读 10,260)
  4. 在C++中实现foreach循环,比for_each更简洁! (累计阅读 9,500)
  5. 几个内存相关面试题(c/c++) (累计阅读 9,447)
  6. 关于使用STL的红黑树map还是hashmap的问题 (累计阅读 8,876)
  7. 浅析C++多线程内存模型 (累计阅读 8,803)
  8. C++ 多线程编程总结 (累计阅读 8,098)
  9. 使用gdb调试运行时的程序小技巧 (累计阅读 7,209)
  10. 在C++里写一个不能被继承的类 (累计阅读 6,581)