VC++开发GIS系统(3)关于#ifndef#define#endif的说明

在我之前的文章使用DLL导出类编程示例中使用到了下面的这样一组代码。

#ifndef _CALLDLG_H_EXPORT
#define CALLDLG_EXPORT __declspec(dllimport)
#else
#define CALLDLG_EXPORT __declspec(dllexport)
#endif

并且在文章warning C4273: dll链接不一致对产生的warning进行了说明和改正。但是很多朋友可能并不了解这代码的含义,包括我本人在内。本文尝试做一个简单的说明。

头文件的重复包含

其实最常见的就是在头文件的重复包含问题的解决上,通常在写头文件的时候会有下面这样的代码。

#ifndef _MYHEADER_H_ 
#define _MYHEADER_H_

//yourcode

#endif

在理论上来说_MYHEADER_H_可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:myheader.h(参考)

条件编译

另外的一种应用也比较常见,就是条件编译。如:

#ifdef _DEBUG
     TRACE("debug mode");
#else
     //release mode
#endif

如果在debug模式下可以查看相关信息,而在release模式下就看不到。

关于DLL导出

也许许多人就是为了看这个的,在之前的文章中我也就是用了这样的代码:

#ifndef _CALLDLG_H_EXPORT
#define CALLDLG_EXPORT __declspec(dllimport)
#else
#define CALLDLG_EXPORT __declspec(dllexport)
#endif

这代码的意义就是:这样在DLL代码本身就是__declspec(dllexport) ,在使用DLL的程序中就变成了__declspec(dllimport),这两标志分别用来指明当前的函数将被导出,和当前函数是被导入的(参考)。

MapGIS将空间位置不相邻但属性相同的图元合并为组合图元 GIS电子书《Handbook of Satellite Remote Sensing Image Interpretation》(PDF版本下载)

作者:,GIS爱好者。
分享本文,请您带上本文链接
分享到:

发表评论