C++extern-C&const&pragma once
extern-C
-
extern "C" 修饰的代码会按照C语言的方式去编译
extern "C" void func() { cout << "func()" << endl; } extern "C" void func(int age) { cout << "func(int age)" << age << endl; }
extern "C" { void func(){ } void func(int age) { } }
- 所以上面的编译不会通过,C语言没有函数重载
- 如果函数同时有声明和实现, 要让函数声明被extern "C"修饰, 函数实现可以不修饰
extern "C" void func(); void func(){ } // 或者 extern "C" { void func(); } void func() { }
- 由于C、C++编译规则的不同,在C、C++混合开发时,C++在调用C语言API时,需要使用extern "C"修饰C语言的函数声明
extern "C" { #include "xxx.h" }
- 也可以在编写C语言代码中直接使用extern "C",这样就可以直接被C++调用
// 通过使用宏__cplusplus来区分C、C++环境 #ifdef __cplusplus extern "C" { #endif // __cplusplus int func1(); int func2(); #ifdef __cplusplus } #endif // __cplusplus
pragma once
- 经常使用#ifdef、#define、#endif来防止头文件的内容被重复包含
- #pragma once 可防止整个文件的内容被重复包含
- 上面两个的区别
- #ifdef、#define、#endif受C/C++标准支持,不受编译器的任何限制
- 有些编译器不支持#pragma once(较老编译器不支持,如GCC 3.4版本之前),兼容性不够好
- #ifdef、#define、#endif可以针对一个文件的部分代码,而#pragma once 只能针对整个文件
const
-
const是常量的意思,被其修饰的变量不可改变
-
如果修饰的是类、结构体(的指针),其成员也不可更改
int p = 10; const int *p0 = &p; // p0不是常量, *p0是常量 int const *p1 = &p; // p1不是常量, *p1是常量 int *const p2 = &p; // p2是常量, *p2不是常量 const int *const p3 = &p; // p3是常量, *p3是常量 int const * const p4 = &p; // p5是常量, *p5是常量 // 总结:const 修饰的是其右边的内容