M的C备忘录——程序环境和预处理

1、 程序的翻译环境和执行环境

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

第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。

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

2、详解编译+链接

2.1、翻译环境

组成一个程序的每个源文件通过编译过程分别转换成目标代码(object code)。

每个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。

链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中

2.2、翻译阶段

3、预处理详解

3.1、预定义符号

__FILE__      //进行编译的源文件

__LINE__     //文件当前的行号

__DATE__    //文件被编译的日期

__TIME__    //文件被编译的时间

__STDC__    //如果编译器遵循ANSI C,其值为1,否则未定义

3.2、#define

3.2.1、#define 定义标识符

#define name stuff
// 如果定义的 stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符

3.2.2、#define 定义宏

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

宏(define macro)。

#define name( parament-list ) stuff

3.2.3、#define 替换规则

在程序中扩展#define定义符号和宏时,需要涉及几个步骤。

1. 在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号。如果是,它们首先被替换。

2. 替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替换。

3. 最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上述处理过程。

3.2.4、#和##

# 的作用

把一个宏参数变成对应的字符串

## 的作用

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

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

3.2.5、带副作用的宏参数

当宏参数在宏的定义中出现超过一次的时候,如果参数带有副作用,那么你在使用这个宏的时候就可能出现危险,导致不可预测的后果。副作用就是表达式求值的时候出现的永久性效果。

3.2.6、宏和函数对比

3.2.7、命名约定

把宏名全部大写

函数名不要全部大写

3.3、#undef

这条指令用于移除一个宏定义。

#undef NAME

//如果现存的一个名字需要被重新定义,那么它的旧名字首先要被移除。

3.4、条件编译

1.

    #if 常量表达式

        //...

    #endif

    //常量表达式由预处理器求值。

2.多个分支的条件编译

    #if 常量表达式

        //...

    #elif 常量表达式

        //...

    #else

        //...

    #endif

3.判断是否被定义

    #if defined(symbol)

    #ifdef symbol
    

    #if !defined(symbol)

    #ifndef symbol

4.嵌套指令

    #if defined(OS_UNIX)

        #ifdef OPTION1

            unix_version_option1();

        #endif

        #ifdef OPTION2

            unix_version_option2();

        #endif

    #elif defined(OS_MSDOS)

        #ifdef OPTION2

            msdos_version_option2();

        #endif

    #endif

3.5、文件包含

3.6.1 头文件被包含的方式

#include "filename"

先在源文件所在目录下查找,如果该头文件未找到,编译器就像查找库函数头文件一样在标

准位置查找头文件。

#include <filename.h>

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

3.5.2、嵌套文件包含

#ifndef __TEST_H__

#define __TEST_H__

//头文件的内容

#endif   //__TEST_H__
//或
#pragma once

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值