预处理指令

1、预处理指令
即编译之前执行的指令 
C中的预处理指令包括:文件包含,宏定义,条件编译

2、文件包含#include <stdio.h>
<>和""的区别
#include <file_1.h>    //直接在C库函数头文件所在目录下找
#include "file_1.h"    //先在main.c所在目录下找,若无到环境变量path路径中找,若无,到C库函数头文件所在目录中找
#include可能会导致重复包含文件,降低编译效率
解决方法:
1、清晰目录结构,避免重复包含
2、在每个头文件中都使用条件编译
避免头文件重复包含
#ifndef one_h
#define one_h
#include <stdio.h>
#endif
注意:#include指令允许嵌套包含,单不允许递归包含(即a.h包含b.h,b.h同时包含a.h)
所有预处理指令以#开头,结尾没有;

3、宏定义

宏定义一个常量
实例:替换数组长度
#define ARRAY_NUM 3
int array_1[ARRAY_NUM] = {3, 1, 9};
  for (int i = 0; i < ARRAY_NUM; i++) {
    printf("%d\n", array_1[i]);
  }

char str[] = "ARRAY_NUM HAHAH";
printf("%s\n", str);
宏定义会替换代码中所有没有被""括住的代码

宏定义一个函数
#define fun_1(a, b) a+b
int result = fun_1(9, 10);
printf("%d", result);

注意:宏定义只会替换代码,不会做计算
#define fun_1(a, b) a*b
int result = fun_1(9+1, 10+1);


4、条件编译

条件编译不能用main函数中的信息做判断,main函数只有在运行期才会执行,一般条件编译的判断使用宏定义的常量进行判断

#define NUM -1

#if !defined(NUM)    //如果没有定义NUM宏
    #if NUM > 0
        printf("NUM大于0");
    #elif NUM == 0
        printf("NUM等于0");
    #else
        printf("NUM小于0");
    #endif
#endif

条件编译的两种写法
#ifdef NUM
#if defined(NUM)

#ifndef NUM
#if !defined(NUM)
时间: 2024-10-24 23:18:00

预处理指令的相关文章

OC高效率52之多用类型常量,少用#define预处理指令

// //  ViewController.m //  OC高效率52之多用类型常量,少用#define预处理指令 /**  *     1. 不要用预处理定义常量.这样定义出来的常量不含类型信息,编译器只是会在编译前据此执行查找与替换操作.即时有人重新定义了常量值,编译器也不会产生警告信息,这将导致应用程序中得常量值不一致.        2.在实现文件中使用static const 来定义"只在编译单元内可见的常量".由于此类常量不在全局符号表中,所以无需为其名称加前缀.     

4、多用类型常量,少用#define预处理指令

摒弃: #define ANIMATION_DURATION 0.3 #define ERROR_MESSAGE @"ErrorMessage" 1)没有常量的类型信息 2)假设此指令声明在某个头文件中,那么所有引入了这个头文件的代码,都可以访问和修改ANIMATION_DURATION. 推荐: 1.私有常量 .m文件 static const NSTimeInterval kAnimationDuration = 0.3; static NSString *const kError

C#预处理指令

C#常用的预处理指令有#region.#endregion:#define.#undef.#if.#elif.#else.#endif: #region.#endregion成对使用,表示一个代码块,可以在#region后面加注释说明,主要是使代码结构美观.清晰: #define.#undef.#if.#elif.#else.#endif一般也一起使用,#define.#undef需要放在文档的开头,#if.#endif必须一起使用: 还有#line.#pragram,似乎不常用.

黑马程序员-C学习笔记-编译预处理指令

------- ios培训. android培训.java培训.期待与您交流! ---------- 一.编译预处理指令 源代码 -> 编译预处理 -> 编译 -> 链接 -> 运行 编译预处理指令:在编译前进行解析处理的指令 特点:所有编译预处理指令都以#开头 所有编译预处理指令都不加分号 二.宏定义 1.不带参数的宏定义:  #define 宏名 值 (1)在预编译的时候所出现宏名标识的地方都会被替换成宏名后面的值 注意点:注释中的宏名不会被替换 在字符串中出现的宏名不会被替换

关于C++代码中的#pragma预处理指令

预处理指令是指在编译器编译代码时,提供按条件跳过源文件中的代码段(节).报告错误(错误信息以及行号)和警告条件,以及描绘源代码的不同区域的能力. 总是占用源代码中的单独一行,并且总是以 # 字符和预处理指令名称开头.# 字符的前面以及 # 字符与指令名称之间可以出现空白符. 下面是可用的预处理指令: #define 和 #undef,分别用于定义和取消定义条件编译符号. #if.#elif.#else 和 #endif,用于按条件跳过源代码中的节. #line,用于控制行号(在发布错误和警告信息

C/C++预处理指令#define,#ifdef,#ifndef,#endif…

本文主要记录了C/C++预处理指令,常见的预处理指令如下: #空指令,无任何效果 #include包含一个源代码文件 #define定义宏 #undef取消已定义的宏 #if如果给定条件为真,则编译下面代码 #ifdef如果宏已经定义,则编译下面代码 #ifndef如果宏没有定义,则编译下面代码 #elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码 #endif结束一个#if……#else条件编译块 #error停止编译并显示错误信息 本来只是想了解一下#ifdef,#ifnd

17-C语言预处理指令3-文件包含

说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.iOS开发不感兴趣,请忽略 这讲介绍最后一个预处理指令---文件包含 一.基本概念 其实我们早就有接触文件包含这个指令了, 就是#include,它可以将一个文件的全部内容拷贝另一个文件中. 二.一般形式 1.第1种形式#include <文件名> 直接到C语言库函数头文件所在的目录中寻找文件 2.第2种形式 #include "文件名&quo

《黑马程序员》预处理指令(宏定义、条件编译、文件包含)(C语言)

宏定义的基本概念 ●  预处理指令都是以#开头 ●  预处理指令分为三种 1.宏定义 定义格式:#define  宏名   参数 2.条件编译 #if 条件语句     statement1; #elif 条件语句     statement2; #else     statement3; #endif       //条件编译结束必须加上此条语句,否则statement3以下的所有语句都将默认为不编译 3.文件包含 ●  预处理指令在代码翻译成0和1之前进行 ●  预处理指令的位置是可以写的

15-C语言预处理指令1-宏定义

预处理指令简介 1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编译 2.为了区分预处理指令和一般的C语句,所有预处理指令都以符号"#"开头,并且结尾不用分号 3.预处理指令可以出现在程序的任何位置,它的作用范围是从它出现的位置到文件尾.习惯上我们尽可能将预处理指令写在源程序开头,这种情况下,它的作用范围就是整个源程序文件 4.C语言提供的预处理指令主要有:宏