最近遇到的几个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; } |
二.字节对齐引发的惨案
先来介绍一下背景,我这里有个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技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:SEO:百度百科理论知识大汇总
后一篇:例证NIF使用的误区 >>
文章信息
- 作者:Dante 来源: Vimer
- 标签: 字节对齐 隐式转化
- 发布时间:2011-01-19 22:22:52
近3天十大热文
- [69] Twitter/微博客的学习摘要
- [65] find命令的一点注意事项
- [64] IOS安全–浅谈关于IOS加固的几种方法
- [62] Go Reflect 性能
- [62] android 开发入门
- [61] 如何拿下简短的域名
- [61] 流程管理与用户研究
- [60] Oracle MTS模式下 进程地址与会话信
- [58] 图书馆的世界纪录
- [58] 读书笔记-壹百度:百度十年千倍的29条法则