【C/C++数据结构与算法】C语言预处理

news/2024/10/20 3:41:15/

目录

一、源文件到可执行程序的过程

二、预处理详解

1. 预定义符号

2. #define

3. 条件编译


一、源文件到可执行程序的过程

  • 预处理:去注释,宏替换,头文件展开,条件编译
  • 编译:c语言 ---> 汇编语言(语法分析、词法分析、语义分析、符号汇总)
  • 汇编:汇编语言 ---> 二进制指令,形成符号表
  • 链接:合并段表,符号表的合并和重定位

二、预处理详解

1. 预定义符号

  • __FILE__ 进行编译的源文件
  • __LINE__ 文件当前的行号
  • __DATE__ 文件被编译的日期
  • __TIME__ 文件被编译的时间
  • __func__ 当前的函数名
void Test() 
{printf("name:%s file:%s line:%d date:%s time:%s\n", __func__, __FILE__, __LINE__, __DATE__, __TIME__);//name:Test file:test.c line:5 date:Mar 10 2023 time:16:27:41
}int main() 
{Test();return 0;
}

2. #define

  • 符号替换
  • 宏替换
#include <stdio.h>
#define PRINT(N, format) printf("the value of "#N" is "format"\n", N)int main() 
{int a = 10;float pai = 3.1415926;PRINT(a, "%d");        //the value of a is 10PRINT(pai, "%.2f");    //the value of pai is 3.14return 0;
}

##:将两端的符号合成一个符号

#include <stdio.h>
#define CAT(x, y) x##yint main() 
{int ABC = 10;printf("%d\n", CAT(A, BC));    //10return 0;
}

宏的参数可以出现类型,函数不行

#define MALLOC(num, type) (type*)malloc(sizeof(type) * num)

用宏定义将一个整数的二进制位的奇数位和偶数位交换

#define SwapIntBit(n) (((n) & 0x55555555) << 1 | ((n) & 0xaaaaaaaa) >> 1)

用一个宏定义计算一个结构体中某成员变量相对于首地址的偏移

#include <stdio.h>
#define offsetof(StructType, MemberName) (size_t)&(((StructType*)0)->MemberName)typedef struct Student 
{char name[20];int age;float score;
}Student;int main() 
{Student stu;int n = offsetof(Student, score);printf("%d\n", n);        //24return 0;
}

3. 条件编译

#include <stdio.h>
#define a 2int main() 
{
#if (a == 1)printf("hello world\n");
#elif (a == 2)printf("hello hdu\n");
#elseprintf("hello china\n");
#endifreturn 0;
}
#include <stdio.h>
#define MAX 0int main() 
{
#if defined(MAX)printf("haha\n");
#endif#ifdef MAX        //判断该符号是否定义printf("haha\n");
#endif#if !defined(max)printf("hehe\n");
#endif#ifndef maxprintf("hehe\n");
#endifreturn 0;
}

#pragma once 避免头文件的重复引用


http://www.ppmy.cn/news/477609.html

相关文章

CSV文件处理工具-CsvUtil

本文章向大家介绍CSV文件处理工具-CsvUtil&#xff0c;主要包括CSV文件处理工具-CsvUtil使用实例、应用技巧、基本知识点总结和需要注意事项&#xff0c;具有一定的参考价值&#xff0c;需要的朋友可以参考一下。 介绍 逗号分隔值&#xff08;Comma-Separated Values&#xff…

win10安装时,提示“我们无法创建新的分区,也找不到现有分区”

win10安装时&#xff0c;提示“我们无法创建新的分区&#xff0c;也找不到现有分区”&#xff0c;如图所示&#xff1a; 解决办法&#xff1a; 将win10安装包&#xff08;ios文件&#xff09;解压&#xff0c;将以下文件复制到系统盘&#xff0c;然后重启电脑&#xff0c;自动…

win10装机、我们无法创建新的分区,也找不到现有的分区

用分区助手分区时&#xff0c;仅c盘所在硬盘需要建立ESP分区MSR分区 如果有两块ssd&#xff0c;可以试试先知安装一条用于安装系统&#xff0c;随后再安装另一条ssd

win10系统安装:我们无法创建新的分区,也找不到现有的分区

解决方法:将固态硬盘和机械硬盘中的&#xff0c;ESP分区和MGR分区删除&#xff0c;再进行相应分区&#xff0c;即可成功运行win10安装程序&#xff0c;亲测有效。

无法创建新的分区也找不到现有的分区 解决办法

UEFI安装的时候&#xff0c;提示这个。解决办法就是删除分区&#xff0c;用安装程序再新建分区就可以了。

win10安装无法创建新分区也找不到现有分区问题

我碰到这个问题原因是系统安装到了新的盘&#xff0c;老盘中还存在esp和msr分区&#xff0c;把老盘中esp和msr分区删掉就可以了。我电脑bios是采用UEFI引导&#xff0c;分区格式为gpt&#xff0c;传统模式是mbr&#xff0c;假如分区格式不对应的话也会出现这个问题。 另外假如…

关于windows安装过程中“我们无法创建新的分区,也找不到现有的分区”问题解决办法

最近在安装电脑系统过程中碰到了这个问题&#xff0c;首先说明下我电脑bios已经设置了uefi引导启动&#xff0c;硬盘分区格式也是GPT格式&#xff0c;还是出现这个问题有点纳闷&#xff0c;后面折腾了好久才找到解决办法&#xff1a; 即在对磁盘进行分区的时候不要创建ESP分区…

win10安装时提示 “我们无法创建分区也找不到现有的分区”

试过了网上的很多方法&#xff0c;无论是添加boot文件还是全盘格式化&#xff0c;似乎都不是那么有效果&#xff0c;偶尔自己用拆分分区的方法弄好了&#xff01;特意分享给大家&#xff01; 装机前要用DiskGenius查看分区情况&#xff0c;按理说这种情况下硬盘肯定是都被分区的…