[C语言终章]程序环境和预处理

1.程序的翻译环境与执行环境图解

在这里插入图片描述

2. 预处理详解

1.预定义符号

__FILE__ //进行编译的源文件
__LINE__ //文件当前的行号
__DATE__ //文件被编译的日期
__TIME__ //文件被编译的时间
__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义

2.#define

1. #define 定义标识符

#define MAX 1000
#define reg register //为 register这个关键字,创建一个简短的名字
#define do_forever for(;;) //用更形象的符号来替换一种实现
#define CASE break;case 在写case语句的时候自动把 break写上

2.#define 定义宏

#include <stdio.h>
#define mul(x) x*x
int main()
{
    
    
	int x = 5;
	printf("%d", mul(x +1));
	return 0;
}
  • 结果不是36,而是11,因为会将表达式直接替换,并不是计算好x+1再传入到宏体

3.#与##

#define PRINT(a) printf("the value of " #a " is %d\n",a)
int main()
{
    
    
	int a = 10;
	int b = 20;
	int c = 30;
	PRINT(a);
	PRINT(b);
	PRINT(c);
	return 0;
}
  • #的作用是 把一个宏参数变成对应的字符串
#define ADD(num,value) \
        sum##num += value
int main()
{
    
    
    int sum5 = 0;
    ADD(5,10);
    printf("%d", sum5);
    return 0;
}

##的作用是将两边符号合成一个符号

4. 宏与函数的对比

宏的优点

  1. 宏与函数比,宏比函数少了函数栈帧的维护,函数传参,函数返回值的返回,函数栈帧的销毁等等步骤,所以在运行效率上比函数快
  2. 函数的参数必须是特定类型,而宏与类型无关
    宏的缺点
  3. 除非宏比较短,否则替换时会加大代码的长度,特别是多次用到宏时,那么会影响代码执行效率
  4. 宏无法调试
  5. 宏没有类型,不够严谨
  6. 宏可能带来运算符优先级的问题

3.undef

  • 移除宏的定义

防止头文件的被重复包含

#ifndefine
#define
头文件内容
#enif
或者
#pragma once

猜你喜欢

转载自blog.csdn.net/wan__xia/article/details/129987496
今日推荐