版权声明:本文为博主原创文章,如需转载请注明出处:https://blog.csdn.net/qq_36059321/article/details/82854709
C与C++在函数的编译过后,由于C++支持函数的重载,所以C跟C++在编译之后生成的汇编码会有所不同,在编译生成的汇编码中,对于C的函数只是一个函数的函数名,而C++函数则会带有一些额外信息,如返回值跟参数类型。
当时C++之父设计C++之时,已经存在了大量的C语言代码,为了支持原有的C库,在C++代码中尽可能的去支持C,而extern"C"就是其中的一个策略。 extern"C"的作用就是告诉编译器,这段代码用按照C语言的编译风格去进行编译
#ifdef __cplusplus
extern "c"{ //告诉C+++编译器,扩号里按照C的命名规则编译
#endif
//代码
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus是什么意思呢,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码。
所以上面的代码的意思就是:
如果这是一段cpp的代码,那么加入extern"C"{}来处理处理括号中的代码。
在代码中可以频繁的看到 #ifndef, #ifdef,#endif,#define 这些关键字,看起来觉得怎么长的这么像,下面就来分析一下这些关键字:
#difine:
#define是宏定义,大家都应该熟悉,#define作用就是字符替换,在编译过程中不会去检查类型安全,这一点上或许没得C++中的const的安全,但是作用是非常大的,来看看几个例子:
#difine PI 3.14
这个作用就是直接在代码中运用PI去代替3.14 可以起到一个很直观的作用,在后面代码中直接看到变量名就知道其中的含义,而且可以直接改变宏的值去进行代码的修改,起到一个很好的维护作用。
宏的使用也会出现一些常见的错误
#define mul(a,b) a*b
sub(3+2,4);
得到的结果是11,并不是20,因为宏的作用只是直接替换,所以计算的方式就是3+2*4=11,需要得到20的话,只要加上两个括号即可:
#define mul((a),(b)) a*b
sub(3+2,4);
这样就能得到20了
#ifdef ,#endif:
#ifdef其实就是两个关键字结合在一起而已:if ,define ,这样就能看的很明白了,假设为真,则进行编译下面代码,注:#ifdef是在编译时执行,如果为真,则进行编译下面代码,如果为假,则不进行编译在代码中可以通过这个宏去注释一段代码:
#ifdef 0
//代码
#endif
#ifndef ,#endif:
所以反过来说,#ifndef的意思就是 if not define(),如果没有为(真),则进行编译下面代码
#ifndef _HEAD_H_
#define _HEAD_H_
#endif
上述代码意思:如果没有宏(HEAD_H),则编译下面代码,然后紧接着一个
#define _HEAD_H_
这样就定义了宏,这样就可以去防止重复编译了。当然名字可以自己随便取,但是一般都是头文件的大写,这样更具有可读性。
#ifndef _A_H_
#define _A_H_
#endif
这样的可读性就很差,不建议这样命名。