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文章
7598浏览量
136172 -
代码
+关注
关注
30文章
4744浏览量
68345 -
预处理
+关注
关注
0文章
33浏览量
10472
发布评论请先 登录
相关推荐
STM32 C语言预处理解析
/1170799353. C语言预处理详解 https://blog.csdn.net/czc1997/article/details/810794984. #define宏定义的优点
发表于 07-22 09:03
LED流水灯C语言常用预处理命令
LED流水灯C语言常用预处理命令 宏定义#define使用:#define 新名称 原内容(不加分号)//对同一个内容,宏定义只能定义一次循
发表于 01-19 06:53
C语言的编译预处理
在将一个C源程序转换为可执行程序的过程中, 编译预处理是最初的步骤. 这一步骤是由预处理器(preprocessor)来完成的. 在源流程序被编译器处理之前,
发表于 09-20 18:17
•47次下载
C语言预处理命令的分类和工作原理详细说明
C 语言编程过程中,经常会用到如 #include、#define 等指令,这些标识开头的指令被称为预处理指令,预处理指令由
发表于 11-25 10:34
•18次下载
C/C++预处理命令的工作原理及分类
摘要:在C/C++语言编程过程中,经常会用到如#include、#define等指令,同时也会涉及到大量的预处理与条件编译,这样做的好处可以
C语言#define的应用
在 C/C++ 编程语言中,当程序被编译时,被发送到编译器,编译器将程序转换为机器语言,然后完成编译并执行该程序。预处理器也称为宏
发表于 03-06 11:29
•338次阅读
评论