程序环境和预处理

本文详细介绍了C语言的编译过程,包括翻译环境与执行环境的区别。重点讲解了预处理阶段,包括预定义符号、宏定义及其规则,特别是#define定义宏和##运算符的使用。同时,讨论了宏定义的优缺点,如类型无关和可能引发的运算符优先级问题。
摘要由CSDN通过智能技术生成

目录

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

1.1编译本身分为几个阶段:

2.预处理详解

2.1预定义符号

 2.2define

2.2.1define定义标识符

 2.2.2#define定义宏

2.2.3#defien 替换规则

 2.2.4#和##


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

在ANSI C的任何一种实现中,存在两个不同的环境。

第一种是翻译环境,在这种环境中源代码转换为可执行的机器指令(二进制指令)。

第二种是执行环境,它用于实际执行代码。

翻译环境(通常指编译器)其实就是将源程序翻译为可执行程序,执行环境是用来执行代码的(通常指操作系统)。

1.1编译本身分为几个阶段:

如下图:

我们假设创建了两个源文件test.c与add.c下图前两行为在Linux系统下的指令。

2.预处理详解

2.1预定义符号

 2.2define

2.2.1define定义标识符

语法:define name stuff

 2.2.2#define定义宏

#define机制包括了一个规定,允许把参数替换到文本中,这种实现称为宏(macro)或定义宏(define macro)

下面是宏的申明方式:

#define name(parament-list)stuff,其中的parament-list是一个由逗号隔开的符号表,它们可能出现在stuff。

注意参数列表的左括号必须与name紧邻。如果两者之间有空白存在,参数列表就会解释为stuff的一部分。

如:

#define SQUARE(X) ((x)*(x))

2.2.3#defien 替换规则

 2.2.4#和##

如何把参数插入到字符中?

首先我们看看这段代码

上面代码输出hello bit

                      hello bit

#include <stdio.h>

#define PRINT(n) printf(#n" is %d\n", n)

int main()
{
    int a = 0;
    int b = 1;

    PRINT(a);//打印结果a is 0
    PRINT(b);//打印结果b is 1

    return 0;
}

##的作用

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

它允许宏定义从分离的文本片段创建标识符

#define CAT(a,b) a##b

int main()
{
    int input = 100;
    printf("%d\n", CAT(in, put));//输出100

    return 0;
}

宏的优缺点

 

3.宏由于类型无关,也就不够严谨。

4.宏可能会带来运算符优先级的问题,导致程序出错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值