0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言-预处理(#define、#if...)

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2022-08-14 10:13 次阅读

1. 区分预处理代码

C语言程序里,出现的#开头的代码段都属于预处理。

预处理:是在程序编译阶段就执行的代码段。

比如: 包含头文件的的代码

#include 
#include 
#include 

下面列出C语言里常用的预处理代码段:

指令 描述
#define 定义宏
#include 包含一个源代码文件
#undef 取消已定义的宏
#ifdef 如果宏已经定义,则返回真
#ifndef 如果宏没有定义,则返回真
#if 如果给定条件为真,则编译下面代码 #if (a==12)||(11==12)
#else #if 的替代方案
#elif 如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码 #if 1==2 #define ABC “123” #elif 2==2 #define ABC “456” #elif 3==3 #define ABC “789” #endif
#endif 结束一个 #if……#else 条件编译块
#error 当遇到标准错误时,输出错误消息
#pragma 使用标准化方法,向编译器发布特殊的命令到编译器中

2. #define 预处理指令: 宏定义和宏替换

2.1 宏替换基本用法和衔接符号使用示例

#include 
//C预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理

#define STR_DATA "123456"  //宏替换用法

//替换的宏一般都是大写
//STR_DATA 称为替换标识符

#define INT_DATA  6666

//带参宏  
#define  PRINT_DATA(x) if(x){printf("为真.\n");} \
					   else {printf("为假.\n");}

int main(int argc,char **argv)
{
    printf("%s\n",STR_DATA);
	printf("%d\n",INT_DATA);
	
	PRINT_DATA(1);
	PRINT_DATA(0);
	return 0;
}

2.2 宏替换的高级用法:#(字符串常量替换符号)

#include 

//字符串常量替换
#define PRINT_DATA1(a,b) printf(#a"456"#b"\n");

#define PRINT_DATA2(a,b) printf("%s,%s\n",#a,#b);

int main(int argc,char **argv)
{
	PRINT_DATA1(123,"789");
	PRINT_DATA2(123,"789");
	return 0;
}

2.3 宏替换的高级用法:##(数据拼接符号)

#include 

//数据拼接符号
#define PRINT_DATA1(a,b) printf("%d\n",a##b);

int main(int argc,char **argv)
{
	PRINT_DATA1(1,4);
	PRINT_DATA1(100,400);
	return 0;
}

#include 
//数据拼接符号
#define PRINT_DATA(a) a##a
int main(int argc,char **argv)
{
	printf("%d\n",PRINT_DATA(6));
	return 0;
}

2.4 宏定义用法

#include 

//#define DEF_A

#ifdef DEF_A
	#define STR_DATA "123"
#else
	#define STR_DATA "456"
#endif

int main(int argc,char **argv)
{
	printf("STR_DATA=%s\n",STR_DATA);
	return 0;
}

3. #ifndef、#ifdef 语句

#include 

#define AA
#ifndef AA
#error "你没有定义AA标识符"
#endif
#ifdef A1
#define STR_DATA "123"
#elif  12==12
#define STR_DATA "456"
#elif  34==45 
#define STR_DATA "789"
#else
#define STR_DATA "ABC"
#endif

int main(int argc,char **argv)
{
	printf("%s\n",STR_DATA);
	return 0;
}

4. defined 预编译语句

#if 0

#include 

//常规的常量替换
#define A1 "1234"
#define A2 6666

/*带参宏*/
#define MAX(a,b) ((a)>(b)?(a):(b))
#define A3(a) if(a){printf("为真.\n");} \
              else {printf("为假.\n");}

//替换字符串常量 #
#define PRINTF_1(a) printf("%s\n",#a);
#define PRINTF_2(a,b) printf(#a"456"#b"\n"); //"123456789"

//数据拼接符号  ##
#define PRINTF_3(a,b) printf("%d\n",a##b); //1234

int main(int argc,char **argv)
{
    printf("%s\n",A1);
    printf("%d\n",A2);

    printf("MAX=%d\n",MAX(12,77));
    A3(1);
    PRINTF_1(1234);
    PRINTF_2(123,789);
    PRINTF_3(12,34);
    return 0;
}
#endif

#if 0
#include 

/*
#if 0
  //为真的时候执行
  int data=123;
#else
  //为假的时候执行
   int data=666;
#endif
*/

#define B1  //定义一个标识符 B1
#undef B1   //取消标识符B1定义

#ifdef B1
  //为真的时候执行
  int data=123;
#else
  //为假的时候执行
   int data=666;
#endif

int main(int argc,char *argv[])
{
    printf("data=%d\n",data);
    return 0;
}
#endif

#include 

#define A3

#if !defined(A1) &&  !defined(A2) && !defined(A3)
#error "没有定义 A1或者A2或者A3"
#endif

int main(int argc,char *argv[])
{
    return 0;
}

5. #include 预编译语句

#include 
#include "./include_file/app.h"
//#include "/mnt/hgfs/linux-share-dir/linux_c/include_file/app.h"  

/* 
#include 语法:  <>  和 ""

#include   告诉编译器,从系统的目录下寻找stdio.h 这个文件。
#include "stdio.h"  告诉编译器,从当前用户目录下寻找stdio.h 这个文件,如果找不到再从系统的目录下寻找。

#include "./include_file/app.h"   告诉编译器,从./include_file目录下寻找头文件
#include "include_file/app.h"  
#include "/mnt/hgfs/linux-share-dir/linux_c/include_file/app.h"  
*/

int main(int argc,char *argv[])
{
    printf("%s\n",A1);
    return 0;
}

6. typedef 关键字

typedef 给类型取别名。

比如:

#include 
void func1(void);
void func2(void);

#if 0
//宏替换
#define u8 unsigned char
#define u16 unsigned short
#define u32 unsigned int
#endif

#if 1
//声明一种新类型
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;

//声明新数据类型: 函数指针类型:   类型名称 func_p
typedef void (*func_p)(void);

//定义一个存放函数地址的数组
func_p func_addr[10]={func1,func2};

//声明新数据类型: 类型abc
typedef char abc[10];

#endif

int main(int argc,char **argv)
{
    u8 a;
    abc a1,a2;
    //通过数组调用函数
    func_addr[0]();
    func_addr[1]();

    printf("%d\n",sizeof(a1));
    printf("%d\n",sizeof(a2));
    return 0;
}

void func1(void)
{
    printf("123\n");
}
void func2(void)
{
    printf("456\n");
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7530

    浏览量

    128567
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66764
  • 预处理
    +关注

    关注

    0

    文章

    32

    浏览量

    10409
收藏 人收藏

    评论

    相关推荐

    C语言预处理

    编译预处理器是C语言编译器的一个重要组成部分。很好的利用C语言预处理命令可以增强代码的可读性,
    发表于 06-03 17:23

    C语言常用的预处理命令

    1.基础知识(1)C语言常用的预处理命令——typedef具体可见C语言基础语法知识。(2)延时函数(知识粗略估计延时时间,若要精确延时,需
    发表于 07-14 07:10

    c语言预处理命令以什么开头

    c语言预处理命令以什么开头,目前我并没有windows软件编写经验,对C语言的应用也仅限于各种单片机的编程,所以对
    发表于 07-20 07:00

    STM32 C语言预处理解析

    /1170799353. C语言预处理详解 https://blog.csdn.net/czc1997/article/details/810794984. #define宏定义的优点
    发表于 07-22 09:03

    STM32 单片机C语言课程4-C语言预处理深入剖析1

    本帖最后由 张飞电子学院张角 于 2021-9-13 11:42 编辑 大家上午好!今天为大家讲解C语言预处理深入剖析,请持续关注,会持续进行更新!前期回顾:STM32 单片机C
    发表于 09-10 08:31

    STM32 单片机C语言课程5-C语言预处理深入剖析2

    大家上午好!今天为大家讲解C语言预处理深入剖析,请持续关注,会持续进行更新!前期回顾:STM32 单片机C语言课程4-
    发表于 09-13 11:40

    C预处理C语言基本数据类型

    嵌入式系统设计师学习笔记二十九:嵌入式程序设计④——C预处理预处理指令表:(编码规范:GB/T 28169-2011)关于宏定义 #denfine 详解可点击连接查看博主的另一篇文章 预定义宏
    发表于 12-21 08:29

    LED流水灯C语言常用预处理命令

    LED流水灯C语言常用预处理命令 宏定义#define使用:#define 新名称 原内容(不加分号)//对同一个内容,宏定义只能定义一次循
    发表于 01-19 06:53

    C语言预处理指令有何功能

    C语言预处理指令有何功能?C语言预处理指令有哪些要求呢?
    发表于 02-25 07:20

    C语言预处理命令有哪些?

    不止。先看几个个常识性问题: A) 预处理C 语言的一部分吗? B) 包含“#”号的都是预处理吗? C)
    发表于 06-25 06:15

    C语言预处理命令的分类和工作原理详细说明

    C 语言编程过程中,经常会用到如 #include、#define 等指令,这些标识开头的指令被称为预处理指令,预处理指令由预处理程序(
    发表于 11-25 10:34 18次下载
    C<b class='flag-5'>语言</b><b class='flag-5'>预处理</b>命令的分类和工作原理详细说明

    C语言预处理指令及分类

    C/C++ 程序中的源代码中包含以 # 开头的各种编译指令,这些指令称为预处理指令。预处理指令不属于 C/C++ 语言的语法,但在一定意义上可以说预处理扩展了 C/C++。
    的头像 发表于 11-29 10:14 2002次阅读

    define宏定义

    define宏定义 以#号开头的都是编译预处理指令,它们不是C语言的成分,但是C程序离不开它们,#define用来定义一个宏,程序在预处理
    的头像 发表于 11-24 15:35 419次阅读

    C语言有哪些预处理操作?

    C语言预处理是在编译之前对源代码进行处理的阶段,它主要由预处理器完成。预处理器是一个独立的程序,它负责对源代码进行一些文本替换和
    的头像 发表于 12-08 15:40 290次阅读
    C<b class='flag-5'>语言</b>有哪些<b class='flag-5'>预处理</b>操作?

    C语言#define的应用

    在 C/C++ 编程语言中,当程序被编译时,被发送到编译器,编译器将程序转换为机器语言,然后完成编译并执行该程序。预处理器也称为宏预处理器。
    发表于 03-06 11:29 116次阅读
    C<b class='flag-5'>语言</b>#<b class='flag-5'>define</b>的应用