extern,inline,宏,sizeof

    技术2022-05-20  46

    Extern

    1.extern int a;表示引用其它模块的全局变量a,此处只是声明 。

    作用是告诉编译器该变量在其它地方已经有定义,如果实际没有,会在链接时报错。

    一般在全局变量对应的头文件中声明,让其它模块包含

     

    2.也可声明函数,但加不加效果一样。

     

    3.声明数组可以不指定大小,但不可以声明为指针(因为数组是常指针?)

     

    4.extern "C" 声明C函数 extern "C" int f(int a); 因为C++编译后函数名带参数类型,来支持重载,不加”C”,调用会被编译成_f_int,加了后编译成_f

    或包含C头文件   extern "C"{

    #include...

    }//注意编译预处理指令必须单独一行

     

    Inline

    1.inline要与函数定义在一起,声明inline不起作用

     

    2.inline函数一般写在头文件中,这样才能被其它模块调用,否则编译时找不到inline

     

    3.类声明中的函数自动成为inline,所以写在声明里的set get不会影响效率,这样等于直接访问私有变量

     

    1. 使用宏时要注意加括号例如 M(a,b) a*b  有可能a是一个加表达式

     

    2.   求结构体成员偏移 FIND(s,a) (size_t)&(((s*)0)->a)

     

    3.   #将参数转为字符串  ##连接多个参数名    ...变参

    例如 x##y  会变成访问xy变量

     

    4.宏多行定义加/

        #define SUM(i,max,s) /

           s = 0; /

           for(i=1; i<max; i++) /

               s += i;

        #define MACRO(arg1, arg2) do { /

           /* declarations */ /

               stmt1; /

               stmt2; /

           } while(0) /* (no trailing ; ) */这么写目的是防止多一个; 如if语句块  if(0)

           ;;

        Else// 多了个分号,else没有匹配

     

    5.undef取消某个宏定义

     

    Sizeof

    1. sizeof是操作符  对类型要加括号,对变量可以不加括号  一般在编译时计算  

     

    2.计算结构体大小

        结构体所有成员的偏移必须是该成员大小的整数倍

        结构体大小是任意成员大小(即最大)的整数倍(不一定要求4字节对齐,例如3个char长度就是3)

        struct s

        {

           double d;

           char c;

        };      其大小为16

        有子结构体时不考虑子结构体大小,子结构体首地址要是子结构体最大成员的整数倍

     

    3.可以用pack预处理指令禁止对齐 (写入文件或者网络传输时用)

     

    4. 类  

    sizeof 一个类时等于数据成员大小 

    static在全局数据区,不计入

    如果有虚函数  则多一个虚函数指针  要注意虚函数指针的地址也要整除4

     

    5.括号中的内容不被编译 用类型替代 sizeof(f())不会调用f() 而是用返回值的类型替代


    最新回复(0)