【深入理解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++】头文件防卫式声明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 纸短情长用计算机破出来的数字,纸短情长简
- 下一篇: 汉字的正则表达式