c/c++结构体对齐,extern “C”与关键字const

1、struct的成员对齐

1.1 、 自然对界(natural alignment)即默认对齐方式,是指按结构体的成员中size最大的成员对齐。

1.2、 指定对界

一般的,可以通过下面的方法来改变缺省的对界条件:

使用伪指令#pragma pack (n),编译器将按照n个字节对齐;

使用伪指令#pragma pack (),取消自定义字节对齐方式。

注意:如果#pragma pack(n)中指定的n大于结构体中最大成员的size,则其不起作用,结构体任然按照size最大的成员进行对界。

2、C++中extern "C"含义深层探索

#ifdef __cplusplus

extern "C"{

#endif

#ifdef __cplusplus

}

#endif

extern "C" 包含双重含义,从字面上即可得到:首先,被它修饰的目标是"extern"的;其次,被它修饰的目标是"C"的。让我们来详细解读这两重含义。

(1)被 extern "C"限定的函数或变量是 extern 类型的;

(2)被 extern "C"修饰的变量和函数是按照 C 语言方式编译和连接的;

未加 extern "C"声明时的编译方式

作为一种面向对象的语言,C++支持函数重载,而过程式语言 C 则不支持。函数被C++编译后在符号库中的名字与 C 语言的不同。例如,假设某个函数的原型为:

void foo( int x, int y );

该函数被 C 编译器编译后在符号库中的名字_foo,而 C++编译器则会产生像_foo_int_int 之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为"mangled name")。_foo_int_int 这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在 C++中,函数 void foo( int x, int y )与 void foo( int x, float y )编译生成的符号是不相同的,后者为_foo_int_float。

3、关键字const

const意味着"只读"

如下声明的意思:

const int a; //a是一个常整型数

int const a; //a是一个常整型数

const int *a; //a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)

int *const a; //a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)

int const *a const; //a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)

相关推荐
汉克老师4 小时前
《从C++小白到算法高手:GESP 1—8级成长地图》第一讲:认识GESP——从编程新手到算法探索者
c++·gesp·信息学竞赛·小学生学c++
晴天的雨.9925 小时前
【C++】继承篇
java·开发语言·c++
青少儿编程课堂5 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
another heaven5 小时前
【C/C++ 第一次跨越(上):用 C++11/14 停止制造新的旧代码】
c语言·c++·制造
qq_406981035 小时前
c++ lamda(三)Lambda表达式
java·前端·c++
I_belong_to_jesus16 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Rabitebla17 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
码客-ygluu1 天前
一个通用游戏数据服务器
c++·架构
another heaven1 天前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
Code_Solitude1 天前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组