• (C语言)程序环境和预处理


    翻译环境

    在这里插入图片描述
    在这里插入图片描述

    linux环境下的可执行程序也是elf格式

    #define定义宏

    #define SQUARE(X) X*X
    int main()
    {
    	int ret = SQUARE(5 + 1);
    	printf("%d\n", ret);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    11
    
    • 1
    5+1*5+1=11
    
    • 1
    #define SQUARE(X) ((X)*(X))
    ((5+1)*(5+1))
    36
    
    • 1
    • 2
    • 3

    宏不能递归

    当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。
    "SQUARE(3)"
    //比如这种就不能替换
    
    • 1
    • 2
    • 3

    ‘#’

    使用 # ,把一个宏参数变成对应的字符串

    #define PRINT(N) printf("the value of "#N" is %d\n",N)
    //#N  ->  "a"
    //N   ->   a
    int main()
    {
    	int a = 10;
    	PRINT(a);
    	int b = 20;
    	PRINT(b);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    the value of a is 10
    the value of b is 20
    
    • 1
    • 2
    #define PRINT(N,FORMAT) printf("the value of "#N" is "FORMAT"\n",N)
    int main()
    {
    	float f = 2.3f;
    	PRINT(f, "%lf");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    the value of f is 2.300000
    
    
    • 1
    • 2

    ‘##’

    ##可以把位于它两边的符号合成一个符号。

    #define CAT(Str,Num)  Str##Num
    int main()
    {
    	int Hello123 = 100;
    	printf("%d\n", CAT(Hello, 123));
    	//printf("%d\n", Hello123);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    100
    
    • 1

    带副作用的宏参数

    #define MAX(x,y)  (x>y?x:y)
    int main()
    {
    	int a = 5;
    	int b = 4;
    	int m = MAX(a++, b++);
    	//int m=((a++)>(b++)?(a++):(b++))
    	printf("m=%d\n", m);
    	printf("a=%d\n", a);
    	printf("b=%d\n", b);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    m=6
    a=7
    b=5
    
    • 1
    • 2
    • 3

    (5)>(4)? a->6,b->5
    a++,后置++,先使用,m=6,后++,a->7

    宏有时候可以做函数做不到的事情。比如:宏的参数可以出现类型,但是函数做不到

    #define MALLOC(num,type)  (type*)malloc((num)*sizeof(type));
    int main()
    {
    	//int* p=malloc(40);
    	int* p= MALLOC(10, int);
    	//int* p=(int*)malloc(10*sizeof(int));
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    #undef

    用于移除一个宏定义

    在这里插入图片描述

    条件编译

    在这里插入图片描述

    防止头文件被重复包含

    方法1
    #pragma once
    int Add(int x, int y);
    
    • 1
    • 2
    • 3
    方法2
    #ifndef __TEST_H__
    #define __TEST_H__
    int Add(int x,int y)
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5

    头文件被包含的方式

    本地文件包含

    #include “filename”
    查找策略:先在源文件所在目录下查找,如果该头文件未找到,编译器就像查找库函数头文件一样在标
    准位置查找头文件。
    如果找不到就提示编译错误

    库文件包含

    #include
    查找头文件直接去标准路径下去查找,如果找不到就提示编译错误。

  • 相关阅读:
    java web技术总结
    二、基本类型及函数使用《2022 solidity8.+ 版本教程到实战》
    java正则表达式匹配${key}形式字符串
    Java配置25-搭建Jenkins服务器
    二叉树刷题(完结篇)
    RocketMQ快速入门_2. rocketmq 的应用场景、与其他mq的差异
    汽车驾驶3D模拟仿真展示系统更立体直观
    深入Go语言:进阶指南
    机器学习之线性回归
    git 拉取tag分支
  • 原文地址:https://blog.csdn.net/qq_63983125/article/details/126048001