extern “C” #ifndef #ifdef #undef #pragma once
来源:互联网 发布:数据可视化工程师薪酬 编辑:程序博客网 时间:2024/06/08 01:57
最近做CPP相关的东西,然后对CPP项目里面遇到的问题进行一个summary,主要的问题,title里大概表明了,在接下来的blog里面主要是讲一下这些东西的一些用法和应用场景等。算是对学习的一个总结吧。
1、extern “C”和extern
这两个东西的用法和作用是完全不一样的。extern “C”是C++代码调用C的代码,作用就是告诉编译器按照C的方式编译,我们都知道C++里面是支持函数重载,但是C里面是不支持的,那么有一个问题,编译器在编译这些重载函数的时候,为了区分开它们,内部是不是做了一些特殊处理以标记它们呢?(当然每种编译器的方法是有区别的)
#ifdef __cplusplusextern "C" {#endif/* c的代码*/}
extern置于变量或者函数前,以标示变量或者函数定义在其他文件里面,可以告诉编译器在遇到这些变量或函数的时候在其他文件寻找其定义;实际上也是在声明变量或函数的作用范围,它们可以在其他文件中使用;它只是一个声明而不是一个定义。比如我们在其他文件中使用这些变量或者声明的时候,只需要包含其所在的头文件即可。
2、#ifndef、#ifdef和#undef
ifndef是“if not define”的简称,属于预处理功能的三种(宏定义,头文件包含,预编译)中的第三种预编译。
定义如下(参照百度百科):
#define x //定义一个宏...#endif//C语言在对程序进行编译时,会先根据预处理命令进行“预处理”。C语言编译系统包括预处理,编译和链接等部分。#ifndef x //先测试x是否被宏定义过#define x程序段1 //如果x没有被宏定义过,定义x,并编译程序段 1#else程序段2 //如果x已经定义过了则编译程序段2的语句,“忽视”程序段 1。#endif//终止if
作用:主要的功能就是防止头文件的重复包含和编译;举个例子,最近的一个项目需要用到很多宏函数和宏,然后我们就将所有的宏放在一个头文件,需要用到这些头文件的时候只需要inlude一下就好了,但是因为头文件很多,很多情况下需要重复的include,这样就遇到一个问题,解决办法就是使用#ifndef来解决这个问题。
ifdef是“if define:的简称,属于预编译。
#ifdef 标识符//程序段1#else//程序段2#endif//当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。
举个例子:
#include <iostream>using namespace std;#define DEBUGint main(int argc, char *argv[]){#ifdef DEBUGcout << "Beginning execution of main()" << endl;#endifreturn 0;}//这个cpp会打印这句话;但是加入我们没有define这个DEBUG,就不会打印。
作用:可以区分一些与特定头文件、程序库、其他文件版本的代码
#undef一般与#define连用
#define WIDTH 80 #define ADD( X, Y ) ((X) + (Y)) . . . #undef WIDTH #undef ADD
//#undef可以移除宏的当前定义;如果遇到宏冲突的问题可以使用这个办法具体的看这篇博客http://blog.csdn.net/zhang_guyuan/article/details/77330604
3、#pragma once
#pragma once的功能和ifndef类似,都可以保证头文件被只编译一次
- extern “C” #ifndef #ifdef #undef #pragma once
- C/C++常用预处理指令总结(#ifdef,#ifndef,#endif,#pragma once ...)
- C/C++指令 #undef ,#ifdef, #ifndef,#if的用法
- C/C++指令#undef,#ifdef,#ifndef,#if的用法
- C/C++指令 #undef ,#ifdef, #ifndef,#if的用法
- C++:#pragma once与 #ifndef的区别
- #ifdef #ifndef extern "c"与头文件
- #pragma once 与 #ifdef
- #pragma once 与 #ifdef
- #pragma once 与 #ifdef !!!
- #pragma once # ifndef
- #pragma once与#ifndef
- #pragma once与#ifndef
- #pragma once 与 #ifndef
- #pragma once #ifndef
- #pragma once与#ifndef
- #pragma once #ifndef
- #pragma once & #ifndef
- js判断数据类型
- 架设 VPN 服务
- Maven学习总结(六)——Maven与Eclipse整合
- PHP面向对象有关问题集合
- xlistview相关操作
- extern “C” #ifndef #ifdef #undef #pragma once
- web.xml 配置-listener
- JDK发展史
- maven导出jar包时出现错误No plugin found for prefix 'dependency' in the current project and in the plugin……
- 屏蔽Xcode8 日志输出
- php openssl加密解密方法
- 二叉查找树(BST)
- jedis与spring整合
- 从上往下打印二叉树