程序环境和预处理(三)

简介: 程序环境和预处理(三)

程序环境和预处理(二)+https://developer.aliyun.com/article/1385005

3.2.7 命名约定

一般来讲函数的宏的使用语法很相似。所以语言本身没法帮我们区分二者。

那我们平时的一个习惯是:

把宏名全部大写

函数名不要全部大写

3.3 #undef

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

#include <stdio.h>
#define MAX(x,y) ((x)>(y)?(x):(y))
int main()
{
  int n = MAX(3, 5);
  printf("%d\n", n);
#undef MAX
  int n = MAX(10, 5);
  printf("%d\n", n);
  return 0;
}

当程序编译时会报错。

3.4 命令行定义

许多C 的编译器提供了一种能力,允许在命令行中定义符号。用于启动编译过程。 例如:当我们根据同一个源文件要编译出一个程序的不同版本的时候,这个特性有点用处。(假定某个 程序中声明了一个某个长度的数组,如果机器内存有限,我们需要一个很小的数组,但是另外一个机器 内存大些,我们需要一个数组能够大些。)

编译指令:

//Linux 环境演示

gcc -D ARRAY_SIZE=10 programe.c

3.5 条件编译

在编译一个程序的时候我们如果要将一条语句(一组语句)编译或者放弃是很方便的。因为我们有条件编译指令,条件满足就编译,条件不满足就不编译。

常见的条件编译指令:

1.单个条件编译

#if 常量表达式

       //...

#endif

#define M 1
int main()
{
#if M==1
  printf("hehe\n");
#endif
}

说明:if语句和#if不同,#if 表达式为假,在预处理阶段就会将代码删除。

2.多个分支的条件编译

#if 常量表达式

       //...

#elif 常量表达式

       //...

#else

       //...

#endif

3.判断是否被定义

如果定义了就执行

#if defined(symbol)

       //…

#endif

#ifdef symbol

       //…

#endif

如果没有定义就执行

#if !defined(symbol)

       //…

#endif

#ifndef symbol

       //…

#endif

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.6 文件包含

我们已经知道, #include 指令可以使另外一个文件被编译。就像它实际出现于 #include 指令的地方 一样。

3.6.1 头文件被包含的方式:

本地文件包含:

       #include "filename"

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

库文件包含:

        #include                

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

对于库文件也可以使用 “” 的形式包含。 但是这样做查找的效率就低些,当然这样也不容易区分是库文件还是本地文件了。

3.6.2 嵌套文件包含

当头文件重复包含,在预处理阶段就会重复保存文件中的内容,这样大大降低了工作效率。为了解决头文件重复包含的问题,我们可以使用条件编译。

#ifndef  TEST_H
#define  TEST_H
    //头文件的内容
#endif   //__TEST_H__

解读:如果没有定义TEST_H,就执行下面的语句,第一次调用,一定没有定义TEST_H,所以执行下面的语句,定义TEST_H,头文件中的内容参与编译;当第二次在调用时,已经定义了 TEST_H,下面的代码不参与编译。

       #pragma once

本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位读者三连支持。文章有问题可以在评论区留言,博主一定认真认真修改,以后写出更好的文章。

相关文章
|
4月前
|
存储 编译器 程序员
程序环境和预处理
程序环境和预处理
53 0
|
8天前
|
存储 自然语言处理 编译器
程序环境和预处理(详解)
程序环境和预处理(详解)
|
4月前
【程序环境与预处理玩转指南】(中)
【程序环境与预处理玩转指南】
|
4月前
|
编译器 Linux C++
【程序环境与预处理玩转指南】(下)
【程序环境与预处理玩转指南】
|
9月前
|
存储 编译器 程序员
【C】程序环境和预处理
在ANSI C的任何一种实现中,存在两个不同的环境。
|
9月前
|
存储 自然语言处理 程序员
【程序环境与预处理】(一)
【程序环境与预处理】(一)
57 0
|
9月前
|
编译器 Linux C++
【程序环境与预处理】(二)
【程序环境与预处理】(二)
55 0
|
5月前
|
存储 自然语言处理 编译器
程序环境+预处理
程序环境+预处理
50 0
|
5月前
|
存储 自然语言处理 编译器
|
5月前
|
Serverless
程序环境和预处理(二)
程序环境和预处理(二)