欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > c/c++ >内容正文

c/c++

【深入理解C++】头文件防卫式声明

发布时间:2024/1/8 c/c++ 48 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【深入理解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 // __cplusplus

math.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_H

3.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 // __cplusplus

3.3 两者区别

(1) #ifndef...#define...#endif 受 C/C++ 标准的支持,不受编译器的任何限制。

(2) 有些编译器不支持 #pragma once(较老编译器不支持,如GCC 3.4版本之前),兼容性不够好。

(3) #ifndef...#define...#endif 可以针对一个文件中的部分代码,而 #pragma once 只能针对整个文件。

总结

以上是生活随笔为你收集整理的【深入理解C++】头文件防卫式声明的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。