VC++编译器中一些常见precompiling 指令介绍

我们在利用vc6.0 project wizard生成的代码中,经常看到大量的precompiling指令。本文讲解了常见的这些指令的作用

1.#pragma once

这个指令是vc编译器特有的指令,其作用是指对该头文件只编译一次。其作用相当于传统的Macro:

#ifndef HeadFile_H

#define HeadFile_H

此处是头文件定义

#endif

因为在一个project中,往往不同头文件之间互相引用。如果不加上这条指令,很可能某个头文件会在某个文件中引用多次而产生错误。加上这条指令后就可以保证该头文件只被引用和编译一次了

例如:

//假设该头文件定义为:classA.h
#pragma once
class A
{
public:
virtual void f(){}
}; 

其等价于

#ifndef classA_h
#define classA_h
class A
{
public:
virtual void f(){}
};
#endif

2.#pragma comment(lib,"XXXX.lib")

该指令的作用是将XXXX.lib库文件包含在project中进行编译,与其具有等同作用的做法是在vc6.0->project->setting->link ->object/library modules 设置为XXXX.lib。 我们知道,对dll的调用分为两种,一种为隐式调用(implicit calss),即为静态调用),这种调用方式要求在编译时候给出dll对象和方法在相应lib文件中的入口地址,因此必须包含lib文件。另外一种方式为显式调用(explicit call),如果要调用Dll中的function,需要经历3个步骤:
Handle h=LoadLibrary(dllName) -->
GetProcAddress(h,functionName) 返回函数指针,通过函指针调用其function-->FreeLibrary(h)
例如:Another.dll有一个int Add(int x,int y)函数。则完整的调用过程如下:

typedef int (* FunPtr)(int,int);//定义函数指针
FunPtr funPtr;
Handle h=LoadLibrary("Another.dll");
funPtr=(FunPtr)GetProcAddress(h,"Add");
funPtr(,);//2+3;
FreeLibrary(h);

当然这种方式下 就不需要lib文件了。

__declspec(dllexport):

一般用作:#define DLL_EXPORT _declspec(dllexport)

请参考文章:http://www.cnblogs.com/Winston/archive/2008/07/05/1236273.html

C++编译器详解(二)常见precompiling 指令介绍的更多相关文章

  1. Redis 详解 (二) redis的配置文件介绍

    目录 1.开头说明 2.INCLUDES 3.MODULES 4.NETWORK 5.GENERAL 6.SNAPSHOTTING 7.REPLICATION 8.SECURITY 9.CLIENTS ...

  2. Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)

    [Android布局学习系列]   1.Android 布局学习之——Layout(布局)详解一   2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)   3.And ...

  3. 爬虫入门之urllib库详解(二)

    爬虫入门之urllib库详解(二) 1 urllib模块 urllib模块是一个运用于URL的包 urllib.request用于访问和读取URLS urllib.error包括了所有urllib.r ...

  4. .NET DLL 保护措施详解(二)关于性能的测试

    先说结果: 加了缓存的结果与C#原生代码差异不大了 我对三种方式进行了测试: 第一种,每次调用均动态编译 第二种,缓存编译好的对象 第三种,直接调用原生C#代码 .net dll保护系列 ------ ...

  5. Android Widget 开发详解(二) +支持listView滑动的widget

    转载请标明出处:http://blog.csdn.net/sk719887916/article/details/47027263 不少开发项目中都会有widget功能,别小瞧了它,他也是androi ...

  6. SpringMVC接受JSON参数详解及常见错误总结我改

    SpringMVC接受JSON参数详解及常见错误总结 最近一段时间不想使用Session了,想感受一下Token这样比较安全,稳健的方式,顺便写一个统一的接口给浏览器还有APP.所以把一个练手项目的前 ...

  7. PopUpWindow使用详解(二)——进阶及答疑

      相关文章:1.<PopUpWindow使用详解(一)——基本使用>2.<PopUpWindow使用详解(二)——进阶及答疑> 上篇为大家基本讲述了有关PopupWindow ...

  8. SpringMVC接受JSON参数详解及常见错误总结

    SpringMVC接受JSON参数详解及常见错误总结 SpringMVC接受JSON参数详解及常见错误总结 最近一段时间不想使用Session了,想感受一下Token这样比较安全,稳健的方式,顺便写一 ...

  9. logback -- 配置详解 -- 二 -- <appender>

    附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...

随机推荐

  1. [z]oracle 创建job

    https://www.cnblogs.com/lijiasnong/p/3382578.html alter system enable restricted session;--创建表create ...

  2. [z] Git pull 强制覆盖本地文件

    git fetch --all git reset --hard origin/master git pull git fetch 只是下载远程的库的内容,不做任何的合并 git reset 把HEA ...

  3. Android 异步加载数据 AsyncTask异步更新界面

    官方文档:     AsyncTask enables proper and easy use of the UI thread. This class allows to perform backg ...

  4. datatable to entiy list 不支持可空类型和枚举类型

    还没有找到解决方法,暂存,希望有知道能告诉我.谢谢.

  5. DevExpress XPO 开发指南 简要

    最近在看devexpress   安装程序中的代码Demos ..  C:\Users\Public\Documents\DevExpress Demos 16.1\Components\WinFor ...

  6. PAT 1004 成绩排名 (20)(代码)

    1004 成绩排名 (20)(20 分) 读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入包含1个测试用例,格式为\ 第1行:正整数n 第2行:第1 ...

  7. Java.Annotations

    Annotation 0. Annotation Tricks http://developer.android.com/reference/java/lang/annotation/Annotati ...

  8. windows netcdf vs 配置

    程序中添加的头文件是netcdfcpp.h文件   ************************************************************************** ...

  9. HISAT,sTRINGTIE,ballgown三款RNA-seq信息分析软件

    HISAT,sTRINGTIE,ballgown三款RNA-seq信息分析软件 2015年04月02日 11:35:47 夜丘 阅读数:8940 标签: 生物 更多 个人分类: 论文笔记   Bowt ...

  10. MySQL自带的4个数据库

    安装完 MySQL 后会发现有四个自带的数据库: information_schema -- 该数据库保存了 MySQL 服务器所有数据库的信息.比如数据库的名称.数据库中的表名称.访问权限.数据库中 ...