🤖 AI文章摘要 qwen-turbo-latest
加载中...

预处理器指令

include指令

   include指令用于将指定文件中的内容包含到本文件.

  #include<headerfile.h> //gcc中只会查找系统头文件库(一般/usr/include、/usr/local/include)
#include"headerfile.h" //gcc会从工作目录中查找, 然后再从系统头文件库中找.
  

define指令

  define指令可以声明宏常量以及宏函数.

  • 宏常量: 宏常量预处理时都转为相应的值,编译器看不到这个变量名
    • 常用的内置宏常量.
      • __FILE__ 替换成一个字符串, 内容是当前文件的路径
      • __LINE__ 替换成一个整形 ,内容表示这个宏出现的行,常用在错误编译错误输出
      • __TIME__ 替换成字符串, 内容是编译的时间
      • __DATE__ 替换成字符串,内容是编译的日期
    • 注意事项
      • 将名称替换成后面的值
      • 支持含有已经定义的宏常量的表达式.
      • 例如已经定义PX , PY .那么可以定义#define OO PX*PY
      • 宏常量名应该大写,区分普通变量
  • 宏函数不是真正的函数, 它在预编译阶段对使用到宏函数的地方按表达式展开
    • 常用宏函数: 一些标准的宏函数封装在stddef.h中
      • offsetof(structName, structMember);结构体成员变量偏移值函数
        • 第一个参数是结构体完整的名字:struct 结构体名//注意:没有结构体名字的不能使用该宏函数
        • 第二个参数是成员变量名字
        • 注意: 宏函数近在预编译阶段展开处理, 展开后可能导致结合顺序的改变
    • 注意事项
  //宏常量定义
#define marcoName valjue
#undefine marcoName
//宏函数定义
#define marcoFunc(arg1,arg2,...) expression //例如#define SUM(x , y) ((x)+(y)) 
  

ifdef指令

  ifdef指令条件编译

  //格式1, 如果已经定义或者存在,那么编译1代码, 如果没定义那么就编译2 代码
#ifdef  某个宏定义名
	...
#else  
	...
#endif 
//格式2, 和格式1的逻辑相反
#ifdef  表达式
	...
#else
	...
#endif 

//通过#ifdef 0 #endif可以实现注释功能
  

预处理常用的技巧

打印日志

  #ifndefin _LOG
#define _LOG()  logfunction()
#else
#define _LOG()
#endif
//这种思路是通过_LOG标志来控制_LOG()宏函数的定义, 从而控制_LOG()的行为. 空的_LOG()宏函数定义将删除代码中所有的日志打印
  

visual C编译器的常用宏指令

  • #define _CRT_SECURE_NO_WARNINGS放在程序第一行 处理由C语言函数的警告操作:
  • #pragma warning(disable:4996)忽略vc警告