您的位置:首页 > 编程语言 > C语言/C++

C/C++实战实用知识点记录

2016-07-16 17:04 357 查看

C/C++实战实用知识点记录

1.extern “C”用法。

  extern “C”可分为两个部分理解。extern表示这部分的函数或变量可在其他模块中使用。”C”表示该部分的函数采用C的编译方式编译,比如函数void foo(int, int)的名字被编译为_foo,而不是C++中的_foo_int_int。extern “C”有主要两个应用场景:1.在C语言中调用C++函数时,C++函数的.h文件中函数声明需要加extern “C”进行修饰。2.在C++语言中调用C函数时,在包含C函数的.h文件时,需要用extern “C”修饰.h文件。(详见:extern “c”用法解析

2.dllimport与dllexport的作用于区别

  详见博客:dllimport与dllexport的作用于区别

3.static的作用

  详见博客:static函数与普通函数

4.字节对齐(有碰到过bug)

  字节对齐涉及到节省内存空间和提高CPU访问内存效率,而一般的PC程序员不会去设置字节对齐(默认的字节对齐访问效率较高)。字节对齐知识点,详见C语言字节对齐问题详解

  碰过的bug表现:程序中有一个C++类,它的一个int型变量表现极其诡异,明明给它赋值,但是读出的数据与赋给它的值不一样。通过调试,发现它在读取内存时错误,偏移了3个字节。在这个int型变量的前面,声明了一个bool变量,调试发现如果将bool变量放到int型变量之后,表现正常。后来发现,在程序中的其他地方(程序不是我写的),定义了一些1字节对齐的结构体,然后基本确认是字节对齐问题。果然在该C++类定义前面加上#pragma pack()这行代码,表现正常。然而,令人费解的是,我查看了所有代码文件,所有的#pragma pack(1)最终都接了一行#pragma pack(),将字节对齐设为vs中默认的字节对齐8.这里我有个疑问:既然设置了字节对齐,程序应该就会按照我的设置进行对齐访问,不应该会出现内存访问错误,为什么还会出现上述bug。而且之前的结构体重#pragma pack(1)和#pragma pack()都是成对出现的,也不可能会影响到C++类啊。

5.只允许运行一个实例

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 C++