相信大家在看代码的时候经常看到下面的代码,一开始我也是一头雾水。不过在查找相关资料后,现在理解了其中的含义
#ifdef __WINDOWS__
#define _PLATFORM_PREFIX_ __declspec(dllexport)
#else
#define _PLATFORM_PREFIX_
#endif
首先应该先明白#ifdef这个关键字的作用,我们可以用它区隔一些与特定头文件、程序库和其他文件版本有关的代码。
下面举几个例子讲解一下:
#include <iostream>
using namespace std;
#define DEBUG
int main(int argc,char* argv[])
{
#ifdef DEBUG
cout<<"hello wrold"<<endl;
#endif
return 0;
}
运行结果为:
改写代码如下:
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
#ifdef DEBUG
cout<<"hello wrold"<<endl;
#else
cout<<"啦啦啦"<<endl;
#endif
return 0;
}
运行结果如下:
基础的大家应该理解了,下面讲一下的实际用法。#define一般定义在特定的头文件中。比如
//头文件test.h
#define DEBUG
#ifdef DEBUG
#endif
//源文件test.cpp
#include <iostream>
using namespace std;
#include "test.h"
int main(int argc, char* argv[])
{
#ifdef DEBUG
cout << "Beginningexecutionofmain()" << endl;
#endif
return 0;
}
运行结果:
如果一个C源程序在不同计算机系统上运行,而不同的计算机又有一定的差异。例如,我们有一个数据类型,在Windows平台中,应该使用long类型表示,而在其他平台应该使用float表示,这样往往需要对源程序作必要的修改,这就降低了程序的通用性。可以用以下的条件编译:
#ifdef WINDOWS
#define MYTYPE long
#else
#define MYTYPE float
#endif
如果在Windows下进行编译则加上#define WINDOWS,这样则编译下面的命令行:
#define MYTYPE long
如果在这组条件编译命令之前未出现以下命令行:#define WINDOWS
则预编译后程序中的MYTYPE都用float代替。这样,源程序可以不必作任何修改就可以用于不同类型的计算机系统。当然以上介绍的只是一种简单的情况,可以根据此思路设计出其它的条件编译。
例如,在调试程序时,常常希望输出一些所需的信息,而在调试完成后不再输出这些信息。可以在源程序中插入以下的条件编译段:
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
#ifdef DEBUG
cout << "is very good !" << endl;
#endif
return 0;
}
如果是在调试时就加上#define DEBUG
,这样就会打印调试信息:
调试结束就可以把#define DEBUG注释掉,这样打印信息就不会打印出来了:
还有下面这种形式:
#ifndef 标识符
//程序段1
#else
//程序段2
#endif
这个与上面差点就是第一行ifndef与ifdef的区别了。它的作用是:若标识符未被定义则编译程序段1,否则编译程序段2。比如:
#include <iostream>
using namespace std;
#define DEBUG
int main(int argc, char* argv[])
{
#ifndef DEBUG
cout << "is very good !" << endl;
#else
cout<<"nihao"<<endl;
#endif
return 0;
}
加上#define DEBUG
就会输出nihao,去掉#define DEBUG
就会打印 is very good !
。其实还有其他的格式但都和他差不多,就不一一介绍了。
感觉有用的小伙伴点个赞再走呗,哈哈!
感觉有用的小伙伴点个赞再走呗,哈哈!。