【深入理解C++】头文件防卫式声明
文章目录
- 1.extern "C" 的作用
- 2.__cplusplus 的作用
- 3.防止头文件被重复包含
- 3.1 #ifndef...#define...#endif
- 3.2 #pragma once
- 3.3 两者区别
1.extern “C” 的作用
我们知道,C++ 支持函数重载,C 语言不支持函数重载。在下面的代码中,我们用 extern "C" 修饰两个重载的函数,程序会报错,说明被 extern "C" 修饰的代码会按照 C 语言的方式去编译。
#include <iostream> using namespace std;// 程序报错,因为C语言不允许函数重载 extern "C" {void func(){cout << "func()" << endl;}void func(int v){cout << "func(int v)" << endl;} }int main() {return 0; }注意:如果函数同时有声明和实现,要让函数声明被 extern "C" 修饰,函数实现可以不修饰。
#include <iostream> using namespace std;// 程序不报错,因为一个按照C语言的方式去编译,一个按照C++的方式去编译 extern "C" void func(); void func(int v);int main() {func();func(10);return 0; }void func() {cout << "func()" << endl; }void func(int v) {cout << "func(int v)" << endl; }输出结果如下:
C++ 在调用 C 语言 API 时,需要使用 extern "C" 修饰 C 语言的函数声明。
2.__cplusplus 的作用
只要是 C++ 文件,都会在最前面自动定义这个宏 #define __cplusplus,因此,我们可以通过使用宏 __cplusplus 来区分 C 或 C++ 环境。
举例:在下面程序中,math.h 和 math.c 是我们自己编写的第三方库,在 test.c 和 test.cpp 中都可以成功调用我们的第三方库。
math.h
#ifdef __cplusplus extern "C" { #endif // __cplusplusint sum(int v1, int v2);int delta(int v1, int v2);#ifdef __cplusplus } #endif // __cplusplusmath.c
#include "math.h"int sum(int v1, int v2) {return v1 + v2; }int delta(int v1, int v2) {return v1 - v2; }test.c
#include "math.h" #include <stdio.h>int main() {printf("%d\n", sum(10, 20));printf("%d\n", delta(10, 20));return 0; }test.cpp
#include "math.h" #include <iostream> using namespace std;int main() {cout << sum(50, 20) << endl;cout << delta(30, 20) << endl;return 0; }3.防止头文件被重复包含
3.1 #ifndef…#define…#endif
使用 #ifndef...#define...#endif 来防止头文件的内容被重复包含。
math.h
#ifndef __MATH_H #define __MATH_H#ifdef __cplusplus extern "C" { #endif // __cplusplusint sum(int v1, int v2);int delta(int v1, int v2);#ifdef __cplusplus } #endif // __cplusplus#endif // !__MATH_H3.2 #pragma once
#pragma once 可以防止整个文件的内容被重复包含。
math.h
#pragma once#ifdef __cplusplus extern "C" { #endif // __cplusplusint sum(int v1, int v2);int delta(int v1, int v2);#ifdef __cplusplus } #endif // __cplusplus3.3 两者区别
(1) #ifndef...#define...#endif 受 C/C++ 标准的支持,不受编译器的任何限制。
(2) 有些编译器不支持 #pragma once(较老编译器不支持,如GCC 3.4版本之前),兼容性不够好。
(3) #ifndef...#define...#endif 可以针对一个文件中的部分代码,而 #pragma once 只能针对整个文件。
总结
以上是生活随笔为你收集整理的【深入理解C++】头文件防卫式声明的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 纸短情长用计算机破出来的数字,纸短情长简
- 下一篇: 新浪微博PC客户端,(蓝星星微博客户端)