C/C++预处理指令#define,条件编译#ifdefine
本文主要记录了C/C++预处理指令,常见的预处理指令如下:#空指令,无任何效果#include包含一个源代码文件#define定义宏#undef取消已定义的宏#if如果给定条件为真,则编译下面代码#ifdef如果宏已经定义,则编译下面代码#ifndef如果宏没有定义,则编译下面代码#elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码#endif结束一个#if……#else条件编译块#error停止编译并显示错误信息条件编译命令最常见的形式为:#ifdef 标识符程序段1#else程序段2#endif例:#ifndef bool#define ture 1#define false 0#endif在早期vc中bool变量用1,0表示,即可以这么定义,保证程序的兼容性在头文件中使用#ifdef和#ifndef是非常重要的,可以防止双重定义的错误。//main.cpp文件#include "cput.h"#include "put.h"int main(){ cput(); put(); cout << "Hello World!" << endl; return 0;}//cput.h 头文件#include <iostream>using namespace std;int cput(){ cout << "Hello World!" << endl; return 0;}//put.h头文件#include "cput.h"int put(){ cput(); return 0;}编译出错;在main.cpp中两次包含了cput.h尝试模拟还原编译过程;当编译器编译main.cpp时//预编译先将头文件展开加载到main.cpp文件中//展开#include "cput.h"内容#include <iostream>using namespace std;int cput(){ cout << "Hello World!" << endl; return 0;}//展开#include "put.h"内容//put.h包含了cput.h先展开#include <iostream>using namespace std;int cput(){ cout << "Hello World!" << endl; return 0;}int put(){ cput(); return 0;}int main(){ cput(); put(); cout << "Hello World!" << endl; return 0;}很明显合并展开后的代码,定义了两次cput()函数;如果将cput.h改成下面形式:#ifndef _CPUT_H_#define _CPUT_H_#include <iostream>using namespace std;int cput(){ cout << "Hello World!" << endl; return 0;}#endif当编译器编译main.cpp时合并后的main.cpp文件将会是这样的:#ifndef _CPUT_H_#define _CPUT_H_#include <iostream>using namespace std;int cput(){ cout << "Hello World!" << endl; return 0;}#endif#ifndef _CPUT_H_#define _CPUT_H_#include <iostream>using namespace std;int cput(){ cout << "Hello World!" << endl; return 0;}#endifint put(){ cput(); return 0;}int main(){ cput(); put(); cout << "Hello World!" << endl; return 0;}这次编译通过运行成功;因为在展开put.h中包含的cput.h,会不生效,前面已经定义了宏_CPUT_H_看了楼主的帖子,不由得精神一振,豁然开朗,牛掰 感谢分享,佩服佩服! bshdhdhdjdjxjdbdjek 楼主辛苦啦,期待下一篇分享 这逻辑绝了,分析得太到位了吧 理性围观,感觉大家说的都有道理~ 这评论区卧虎藏龙,个个都是人才! 已转发给朋友,一起感受这份快乐~ 来凑个热闹,为楼主增加点人气!
页:
[1]
2