C++学习——C/C++预处理指令和预编译选项

本文详细探讨了C/C++编程中的预处理指令,如#define、#ifdef/#ifndef/#endif以及#pragma,涵盖了宏定义的使用、条件编译控制库搜索和链接器选项设置。特别关注了静态链接库和DLL导出的方法,以及如何通过#pragma comment进行预编译选项设置。同时介绍了BCB编译器及其预编译选项Z系列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:https://blog.youkuaiyun.com/bailyzheng/article/details/7537872

预处理指令

1. #define

2. #ifdef #ifndef #endif

3. #pragma 参数

  • #pragma comment
    格式:#pragma comment(comment-type, ["commentsting"])
    comment-type是预定义标识符,包括compiler, exestr, lib, linker之一
    compiler: 编译器的版本或者名字
    exestr: 将取消
    lib: 添加库搜索记录到对象文件中,可以在一个源文件中设置多个库记录,在对象文件中的顺序与在源文件中的顺序一议案给。
    linker: 指定一个连接选项,这样就不用在命令行输入或者在开发环境中设置了。选项包括/DEFEAULTLIB, /EXPORT, /INCLUDE, /MANIFESTDEPENDENCY, /MERGE, /SECTION
    例子:

    • 静态链接库文件
    #pragma comment(lib,"ws2_32.lib")
    
    • 链接器选项
    #pragma comment(linker,"/INCLUDE:__tls_used")
    
    • 其他用法:
      (1) /DEAFULTLIB:library
      添加一个library到LINK解析引用时搜索的库列表。在命令行指定库之后目标文件中指定的默认库之前搜索libray。/NODEFAULTLIB:library可以重写选项/DEFAULTLIB:library
      (2) /EXPORT:entryname[,@ ordinal[,NONAME]][,DATA]
      用于从本程序导出函数,以便其他程序可以使用。也可以导出数据。通常用在DLL文件中。entryname是函数或数据项的名称,ordinal为1-65535之间的索引。NONAME指定将函数通过序号导出,没有entryname
      DATA指定导出项为数据项,客户程序中数据项必须用extern __declspec(dllimport)来声明。

        > 三种导出定义的方法:
        > __declspec(dllexport)
        >	.def文件中的EXPORTS语句
        >	LINK命令中的/EXPORT
      

      (3)/INCLUDE:symbol
      通知链接器将指定的符号添加到符号表。
      要指定多个符号,则在符号名称之间键入逗号、分号或空格。命令行中,对每个符号指定一次/INCLUDE:symbol。
      这个功能对于包含不会链接到程序的库对象非常有用。用该选项指定符号将通过/OPT:REF重写该符号移除。

  • 定义数据段

    #pragma data_seg(".CRT$XLX")
    	PIMAGE_TLS_CALLBACK pTLS_CALLBACKs[] = {TLS_CALLBACK1, TLS_CALLBACK2, 0}
    #pragma data_seg()
    
  • 指定只编译一次

    #pragma once
    

    由于可移植性问题,可以使用另一种方案:#ifndef, #define, #endif

  • 设置程序中函数代码存放的代码段(开发驱动程序的时候使用)

    #pragma code_seg(["section-name"[,"section-class"]])
    
  • 预编译头文件到此为止,后面的头文件不进行预编译。防止预编译所有头文件占用太多磁盘空间。

    #pragma hdrstop
    

    BCB是什么

预编译选项

Z, /MT, /ZP[1/2/4/8/16]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值