Linux高级C--预处理

本文介绍了Linux高级C编程中的预处理概念,包括去掉注释、头文件包含、宏替换和条件编译。同时,文章讲解了字节序的大端序和小端序,并提供了判断字节序的代码示例。内容适合已掌握基础C语言的开发者进阶学习。
摘要由CSDN通过智能技术生成

Linux高级C

本系列是基于入门学完的基础上,为了更好的玩机体验,对一些知识点的进一步延伸与扩展。


注意啦:以下是本人介绍哦
📕作者简介:S学长,致力于C/C++、嵌入式。从事嵌入式行业,热爱健身,身体倍棒的一位博主。
📗本文收录于Linux高级C系列,大家有兴趣的可以看一看
📘相关专栏C语言嵌入式开发、C语言入门系列等,日常Bug集期待你的指导。
📙Linux爱上Ubuntu系列正在发展中,喜欢嵌入式的朋友们可以关注一下哦!


一、预处理

使用gcc编译程序,需要经历四个步骤:预处理------编译-------汇编-------链接
预处理为编译的第一步
主要有以下四个功能

1、去掉注释

编译之前需要去掉,这些只为提高程序可读性,对程序本身并无实际意义的注释

2、头文件包含

两种格式:
(1) #include <文件名.h>
//编译器会直接去系统目录下去找头文件
(2) #indlude “文件名.h”
//编译器先在当前目录下找头文件,没有再去系统目录下找

3、宏替换

宏指的是用#define定义的符号,这些符号可以表示常量,字符串,或者表达式等

概念:在预处理时,编译器将会用常量,字符串,表达式替换掉程序中的宏

宏命名一般格式:(下划线)+大写文件名+(下划线)
宏的介绍在即入门C中有讲,不带参宏,带参宏等等,这里不在赘述。

代码示例:不同类型数据最大值

    #include <stdio.h>
    #define MAX(a,b)  (a) > (b) ? (a) : (b)
    #define FUN(a,b)  (a)*(b)
    //提醒宏参数要用括号
    int fun1(int a,int b) {
        return a > b ? a : b;
    }
    float fun2(float a,float b){
        return a > b ? a : b;
    }

    int main(void){
        int a,b;
        
        printf("请输入a和b:");
        scanf("%d%d",&a,&b);

        printf("max = %d\n",fun1(a,b));
        printf("max = %d\n",MAX(a,b));
        printf("max = %.2f\n",fun2(4.5,6.7));
        printf("max = %.2f\n",MAX(4.5,6.7));
        printf("%d\n",FUN(a,b));
        printf("%d\n",FUN(a+2,b+5));

        return 0;
    }

运行结果:
在这里插入图片描述

4、条件编译

介绍三种

1> 如果定义了宏,则编译代码段A,否则,编译代码段B,常用于测试函数

#ifdef  宏       
	代码段A
#else
	代码段B
#endif

代码示例:测试代码

    #include <stdio.h>
    #define DEBUG
    int fun(int a,int b)
    {
        int c;
        c = a*a + b*b;
        return c;
    }

    #ifdef DEBUG
    int main(void)
    {
        printf("%d\n",fun(4,5));
        return 0;
    }
    #endif

注释掉#define DEBUG 后主程序不运行。


2> 如果没有定义宏,则编译代码段A,否则,编译代码段B,常用于头文件

#ifndef  宏       
	代码段A
#else
	代码段B
#endif

代码: 头文件的示例

    #ifndef __HEAD_H__
    #define __HEAD_H__

    int x = 120;

    #endif

防止多次引入头文件。


3>如果表达式为真,则编译代码段A,否则,编译代码段B,常用于注释一段代码

#if   表达式       
代码段A
#else
	代码段B
#endif    

代码示例:注释程序

   int main(void) {
    #if 1
        printf("hello world\n");
    #else
        printf("farsightg\n");
    #endif
        return 0;
    }

二、字节序

概念:多字节数据在内存中存储时,每个字节的存放的顺序称为字节序.

字节序分为大端序和小端序
1>大端序
最低有效位所在的字节放在最高字节位置上,其他字节依次放在低字节位置上,则该字节序称为高位优先(即大端序)。
2>小端序
最高有效位所在的字节放在最高字节位置上,其他字节依次放在低字节位置上,则该字节序称为低位优先(即小端序)。
代码示例:字节序判断

#include <stdio.h>

void fun(void){
	unsigned int x = 0x12345678;
	unsigned char y = *(unsigned char*)&x;

	if(y == 0x78)
		printf("小端序\n");
	else
		printf("大端序\n");

}

int main(void){
	fun();	
	return 0;
}

运行结果:
在这里插入图片描述


总结

主要讲解预处理四个步骤,在条件编译中企业会经常考。大端序和小端序是按照谁优先存储判定,先存小端数据就是小端序,反之亦然。

如果这份博客对大家有帮助,希望各位给S学长一个免费的点赞👍作为鼓励,并评论收藏一下⭐,谢谢大家!!!
制作不易,如果大家有什么疑问或给S学长的意见,欢迎评论区留言。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

S安东尼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值