编程经常碰到,理解的总不是很透彻,在这里查阅资料总结一下!

在编写程序的时候,我们常用到#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作。

#pragma once :

这是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,避免文件被重复包含。

#pragma comment :
该指令的格式:

#pragma comment( comment-type [,"commentstring"] )
该指令将一个注释记录放入一个对象文件或可执行文件中。
comment-type(注释类型):可以指定为五种预定义的标识符的其中一种。

commentstring是一个提供为comment-type提供附加信息的字符串,

五种预定义的标识符为:

1、compiler:

将编译器的版本号和名称放入目标文件中,本条注释记录将被编译器忽略。
如果你为该记录类型提供了commentstring参数,编译器将会产生一个警告。
例如:#pragma comment( compiler )

2、exestr:

将commentstring参数放入目标文件中,在链接的时候这个字符串将被放入到可执行文件中。
当操作系统加载可执行文件的时候,该参数字符串不会被加载到内存中.但是,该字符串可以被dumpbin之类的程序查找出并打印出来,你可以用这个标识符将版本号码之类的信息嵌入到可执行文件中!

3、lib:

这是一个非常常用的关键字,用来将一个库文件链接到目标文件中。

常用的lib关键字,可以帮我们连入一个库文件。
例如: #pragma comment(lib, "user32.lib")
该指令用来将user32.lib库文件加入到本工程中。

4、linker:

将一个链接选项放入目标文件中,你可以使用这个指令来代替由命令行传入的或者在开发环境中设置的链接选项,你可以指定/include选项来强制包含某个对象。

例如:
#pragma comment(linker, "/include:__mySymbol")

你可以在程序中设置下列链接选项

/DEFAULTLIB

  • /EXPORT

  • /INCLUDE

  • /MANIFESTDEPENDENCY

  • /MERGE

  • /SECTION

(1)/DEFAULTLIB:library

/DEFAULTLIB 选项将一个 library 添加到 LINK 在解析引用时搜索的库列表。用 /DEFAULTLIB指定的库在命令行上指定的库之后和 .obj 文件中指定的默认库之前被搜索。

忽略所有默认库 (/NODEFAULTLIB) 选项重写 /DEFAULTLIB:library。如果在两者中指定了相同的 library 名称,忽略库 (/NODEFAULTLIB:library) 选项将重写 /DEFAULTLIB:library。

(2)/EXPORT:entryname[,@ordinal[,NONAME]][,DATA]

使用该选项,可以从程序导出函数,以便其他程序可以调用该函数。也可以导出数据。通常在 DLL 中定义导出。entryname 是调用程序要使用的函数或数据项的名称。ordinal 在导出表中指定范围在 1 至 65,535 的索引;如果没有指定 ordinal,则 LINK 将分配一个。NONAME 关键字只将函数导出为序号,没有 entryname。

DATA 关键字指定导出项为数据项。客户程序中的数据项必须用 extern __declspec(dllimport) 来声明。

有三种导出定义的方法,按照建议的使用顺序依次为:

  1. 源代码中的 __declspec(dllexport)

  2. .def 文件中的 EXPORTS 语句

  3. LINK 命令中的 /EXPORT 规范

所有这三种方法可以用在同一个程序中。LINK 在生成包含导出的程序时还创建导入库,除非生成中使用了 .exp 文件。

LINK 使用标识符的修饰形式。编译器在创建 .obj 文件时修饰标识符。如果 entryname 以其未修饰的形式指定给链接器(与其在源代码中一样),则 LINK 将试图匹配该名称。如果无法找到唯一的匹配名称,则 LINK 发出错误信息。当需要将标识符指定给链接器时,请使用 Dumpbin 工具获取该标识符的修饰名形式。

(3)/INCLUDE:symbol

/INCLUDE 选项通知链接器将指定的符号添加到符号表。

若要指定多个符号,请在符号名称之间键入逗号 (,)、分号 (;) 或空格。在命令行上,对每个符号指定一次 /INCLUDE:symbol。

链接器通过将包含符号定义的对象添加到程序来解析 symbol。该功能对于添包含不会链接到程序的库对象非常有用。用该选项指定符号将通过 /OPT:REF 重写该符号的移除。

我们经常用到的是#pragma comment(lib,"*.lib")这类的。

#pragma comment(lib,"Ws2_32.lib")表示链接Ws2_32.lib这个库。

和在工程设置里写上链入Ws2_32.lib的效果一样

5、user:

将一般的注释信息放入目标文件中,commentstring参数包含注释的文本信息,这个注释记录将被链接器忽略。
例如:
#pragma comment( user, "Compiled on " __DATE__ " at " __TIME__ )

原文地址:

http://szshdy.blog.163.com/blog/static/13220125120101271437127/

转载于:https://www.cnblogs.com/chaosimple/archive/2013/02/18/2915152.html

[转]#pragma once和#pragma comment相关推荐

  1. PIC中的#pragma idata 和#pragma udata

    PIC中的#pragma idata 和#pragma udata: idata表示已经初始化的数据.udata表示没有初始化的数据. 当一个数据块没有足够的空间用于存放一个连续的数据时(数组):此时 ...

  2. #pragma DATA_SECTION与#pragma CODE_SECTION的使用

    (一)#pragma DATA_SECTION 利用CCS进行DSP编程时,如果不指定变量的存储位置,那么编译器会自动给变量分配存储位置,但是,有些时候,需要将某个变量存放到某个特定的位置,这个时候就 ...

  3. #pragma warning( pop ) #pragma warning( push )

    今天在看源码的时候,遇到以下内容: #pragma warning(push)是保存当前的编译器警告状态: #pragma warning(pop)是恢复原先的警告状态. 例如: #ifdef _MS ...

  4. 预处理指令pragma常见用法集锦(#pragma once、#pragma comment和#pragma warning)

    #pragma once: 这是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,避免文件被重复包含. ********************************* ...

  5. c语言 pragma code,关于#pragma CODE_SECTION的用法?

    #pragma CODE_SECTION(adc_isr, "ramfuncs");这样的语句是什么意思呢?是不是需要经常调用的程序都需要作这样的定义? Seven Han: 关于 ...

  6. pragma comment的使用 pragma预处理指令详解

    pragma comment的使用 pragma预处理指令详解 #pragma comment( comment-type [,"commentstring"] ) 该宏放置一个注 ...

  7. #pragma comment和#pragma 预处理指令详解

    该宏放置一个注释到对象文件或者可执行文件. 例如,#pragma   comment(lib,"Ws2_32.lib")表示链接Ws2_32.lib这个库. 和在工程设置里写上链入 ...

  8. #pragma comment()

    #pragma   comment() 把所需要的外部库文件加到工程中来.     #pragma   comment(   lib,"xxx.lib"   )         每 ...

  9. pragma comment的使用(转)

    #pragma 的使用 尽管 C 和 C++ 都已经有标准,但是几乎每个编译器 (广义,包含连接器等) 扩展一些 C/C++ 关键字. 合理地应用这些关键字,有时候能使我们的工作非常方便.下面随便说说 ...

最新文章

  1. 双向链表删除节点时间复杂度_删除链表的节点(剑指offer第十七题)
  2. 面试官:你用过哪些JDK自带的命令行工具
  3. 忽然觉得照着技术文档一个demo一个demo的写是一个十分好的学习方式
  4. 多数据库支持的应用程序设计(来自深空老大)
  5. ECMAScript 2019(ES10)新特性简介
  6. Matlab中数组下标是logical,如何处理?
  7. 13. 使用类 【连载 13】
  8. 防火电缆分类、标准、阻燃等级划分详细说明
  9. mysql里一个中文多少个字节_mysql里中文占多少个字节?
  10. C. Dominant Character
  11. Android进程永生技术终极揭秘:进程被杀底层原理、APP应对技巧
  12. BST中序遍历(Iterative)
  13. mybatis 查询出的日期没有时分秒
  14. iOS 【适配iPhone XR/iPhone XS Max】
  15. 图神经网络 | (6) 图分类(SAGPool)实战
  16. Matlab读Zygo干涉仪面形数据并进行37阶Zernike拟合(附Matlab代码)
  17. 史上最全!!!ARM架构下的NVIDIA Xavier安装ROS-Melodic以及使用速腾激光雷达+A-loam获取点云图
  18. QT使用libmodbus库与施耐德PLC通信
  19. P1074 靶形数独题解
  20. 5G与区块链发展分析

热门文章

  1. FPGA之道(54)状态机的设计
  2. JAVA面向对象的总结(函数重载与数组)
  3. C# 8新提案让泛型Attribute成为现实
  4. Merge into 详细介绍
  5. JavaScript 输出
  6. 查看mysql字符集及修改表字符集
  7. 下面首先来看GCD的使用
  8. [Flash开发笔记] 关于Flash中的ASO文件
  9. 华为荣耀8青春版计算机在哪里,华为荣耀8青春版
  10. ros 中对一个点利用tf工具旋转,python or C++