文章目录

  • 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++】头文件防卫式声明相关推荐

  1. 头文件防卫式声明/引用/static/extern/

    文章目录 1.头文件防卫式声明 2.引用 2.1 引用的本质 2.2 引用与指针的区别(特别的const指针?) 2.3引用传递和引用返回 3.static 3.1 静态局部变量 3.2 全局变量 3 ...

  2. C++ 局部变量及初始化 auto 头文件防卫式声明 引用 常量

    cpp文件 project3 #include<iostream> #include"head1.h" #include"head2.h" usin ...

  3. c语言头文件和源文件_C语言头文件防卫式声明

    C语言一般提供三种预处理功能:宏处理.文件包含.条件编译.头文件防卫式申明中会用到条件编译中 #ifndef.#define.#endif 的用法.所以,首先价绍下条件编译. 1 条件编译 一般情况下 ...

  4. c++头文件防卫式声明

    c++头文件防卫式声明 实例: 添加两个头文件head1.h,head2.h 在两个头文件中分别定义两个全局变量: int g_globalh1 = 8; int g_globalh2 = 5; 主程 ...

  5. C++ 11 深度学习(一)auto、头文件防卫、引用、常量

    1.数组初始化 int a[]{ 1,2,3,4,5 }; 2.C++11 auto auto可以在声明变量的时候根据变量的初始值的类型自动为此变量先择合适的类型,声明时要赋予初值. auto自动推导 ...

  6. C++面向对象(1):防卫式声明

    C++ Header Guards Description: 例一:定义同名函数 例二:重复调用头文件 防卫式声明: Description: C++ 中的条件 Header Guards(防卫式声明 ...

  7. C++头文件的防卫式声明(为了防止多次include)

    C++的某个头文件通常需要被多个文件include,为了防止同一个头文件被包含多次导致了重复定义,需要在头文件中加上以防卫式声明,例如对于头文件的"complex.h",其防卫式声 ...

  8. c++头文件中的防卫式声明

    c++关于头文件中的防卫式声明 防止由于同一个头文件被包含多次,从而导致重复定义 在写头文件时,有两种方法用来进行防卫式声明: 1.宏定义方法: #ifndef FILENAME #define FI ...

  9. C++中的防卫式声明

    防卫式声明(guard)的写法及其作用. 先按住不说 guard 的写法,我们先谈谈为什么需要在头文件开头加上防卫式声明. 假如你现在在撸一个项目,该项目需要包含众多头文件: #include< ...

最新文章

  1. mysql每组随机一条_MySql分组后随机获取每组一条数据的操作
  2. java ios支付接口开发_微信支付接入(Android/IOS(swift)/Java后台)
  3. javascript要点
  4. 2014阿里巴巴校园招聘笔试题 - 中南站
  5. 辅助类BinaryTreeNodeLeftChildRightSibling(左孩子右兄弟,二叉树结点)
  6. Windows:chm 文件打开出现“已取消到该网页的导航”的解决方案
  7. layui 渲染select下拉选项 ,日期控件的用法
  8. php sql取数据生成数组中,php中实现数组生成要执行的sql语句
  9. IE6、IE7、IE8、Firefox通用关闭窗口js
  10. js 对一个字段去重_js正则去重及(?=)的匹配规则
  11. 第一章节 初识C#程序
  12. 王庆的边缘计算(第一章)
  13. linux解析器错误权限不够,实例解析Linux下目录的权限
  14. 联想G480改装固态硬盘、光驱变机械硬盘以及装系统(上)
  15. 契约锁“7大”签约避坑指南,帮您化解99%的合同签署麻烦
  16. 【学习资料分享】光纤KVM坐席管理系统解决方案
  17. 苹果手机上怎么打开html,苹果手机信息怎么打开浏览器
  18. c语言程序发生算术溢出,谈谈C语言的溢出
  19. 旧金山第二天: OOW 开始
  20. 软件企业认定的税收优惠政策讲解

热门文章

  1. DevOps: Mountain Duck - 多网盘挂载本地工具
  2. 从零搭建uniapp app,适合小白,傻瓜化,页面搭积木可视化创建
  3. c语言程序电子琴21个音符,儿童电子琴入门《认识附点音符,二分附点音符》
  4. MATLAB相对声压分布彩图,矩形声化学反应器声场分布纵向共振研究
  5. <第六、七周>新店日记,shopee怎么怎么开广告?怎么定价比较合理?
  6. yolov8 做图片分类和 ResNet Efficientnet 等常用分类网络的对比
  7. 用户需求和产品需求的采集、分析、筛选和管理
  8. 2020 乐山师范学院新生程序设计大赛题解
  9. 178685-33-1,Azide-PEG3-Tos叠氮化物(N3)基团通过点击化学与炔烃、BCN、DBCO反应
  10. 中文数字转换成阿拉伯数字(一千二百三十四万五千六百七十八-->12345678)