我的C语言.条件编译与预处理指令

#ifdef


watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zu25Y-B6Zu25Y-B6Zu25Y-B,size_20,color_FFFFFF,t_70,g_se,x_16

  •  ifdef是判断后面标识符是否被#define定义。
  • 如果被定义了就执行#ifdef与#endif之间的语句。
  • 如果没有被定义就不会执行#ifdef与#endif之间的语句。
  • #ifdef只管后面的标识符是否被定义,如果标识符被定义了不管后面的标识符是何值都会被执行。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zu25Y-B6Zu25Y-B6Zu25Y-B,size_20,color_FFFFFF,t_70,g_se,x_16

  •  #ifdef还可以与#else搭配使用。
  • 如果#ifdef后面的标识符没有被定义,就执行#else与#endif之间的语句,不执行#ifdef与#else之间的语句。
  • #ifdef只能与一个#else搭配使用,也就是说,根据标识符有没有被定义,二选一来执行。

 

#ifndef


watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zu25Y-B6Zu25Y-B6Zu25Y-B,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zu25Y-B6Zu25Y-B6Zu25Y-B,size_20,color_FFFFFF,t_70,g_se,x_16

  •  #ifndef与ifdef的逻辑相反。
  • 如果#ifndef后面的标识符没有被定义,就执行#ifndef与#else之间的语句。
  • 如果被定义了,就执行#else与#endif之间的语句。

#if


watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zu25Y-B6Zu25Y-B6Zu25Y-B,size_20,color_FFFFFF,t_70,g_se,x_16

  •  #if后面必须是一个常量表达式。
  • 基本逻辑与if语句相似,都是选择语句。
  • 上面三个例中执行:代码1,代码3,代码6。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zu25Y-B6Zu25Y-B6Zu25Y-B,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zu25Y-B6Zu25Y-B6Zu25Y-B,size_20,color_FFFFFF,t_70,g_se,x_16

#if defined与#if ! defined


watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zu25Y-B6Zu25Y-B6Zu25Y-B,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zu25Y-B6Zu25Y-B6Zu25Y-B,size_20,color_FFFFFF,t_70,g_se,x_16

  • #if defined()与#if ! defined()分别对应着#ifdef与#ifndef。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zu25Y-B6Zu25Y-B6Zu25Y-B,size_20,color_FFFFFF,t_70,g_se,x_16

  •  #if defined()与#if ! defined()解决了#ifdef与#ifndef只能二选一的问题。
  • 如果C与CPP同时定义打印1,如果C与CPP其中一个被定义打印2,如果都没有定义打印3。

#include


" "与< >的区别

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zu25Y-B6Zu25Y-B6Zu25Y-B,size_20,color_FFFFFF,t_70,g_se,x_16

  •  " ":先在源文件所在目录下查找,如果该头文件未被找到,编译器就像查找库函数头文件一样在标准位置查找头文件。如果找不到就提示编译错误。
  • < >:直接去标准路径下去查找,如果找不到就提示编译错误。
  • " "最好用在自己的头文件,而< >用在引用库函数的头文件中。如果都用" "时间效率会降低。

怎样避免头文件重复包含

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zu25Y-B6Zu25Y-B6Zu25Y-B,size_20,color_FFFFFF,t_70,g_se,x_16

  • 所有头文件都必须带上条件编译,防止被重复包含!
  • 那么,重复包含一定报错吗?
  • 不会!重复包含,会引起多次拷贝,主要会影响编译效率!同时,也可能引起一些未定义错误,但是特别少。
  • #include本质是把头文件中相关内容,直接拷贝至源文件中。

#undef

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zu25Y-B6Zu25Y-B6Zu25Y-B,size_20,color_FFFFFF,t_70,g_se,x_16

  •  #undef用于取消#define定义的标识符与宏
  • 所以,我们要清楚#define的作用范围,从定义语句开始一直往下都能作用,除非遇到#undef。

#error

  • 核心作用是可以进行自定义编译报错。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zu25Y-B6Zu25Y-B6Zu25Y-B,size_17,color_FFFFFF,t_70,g_se,x_16

 #line

  • 先了解一下预定义符号

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zu25Y-B6Zu25Y-B6Zu25Y-B,size_20,color_FFFFFF,t_70,g_se,x_16

  • 本质是可以定制化你的文件名称和代码行号,很少使用。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zu25Y-B6Zu25Y-B6Zu25Y-B,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zu25Y-B6Zu25Y-B6Zu25Y-B,size_20,color_FFFFFF,t_70,g_se,x_16

#pragma

  • #pragma message()作用:可以用来进行对代码中特定的符号(比如其他宏定义)进行是否存在进行编译时消息提醒。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zu25Y-B6Zu25Y-B6Zu25Y-B,size_20,color_FFFFFF,t_70,g_se,x_16

  • #pragma warning(disable:XXXX)是禁止某些错误报错。
  • #pragma pack( )修改默认对齐数。
  • #pragma once防止头文件重复包含。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值