计算机是怎么读懂C语言的?(下)

简介: 预处理中的其他东西

命令行定义

C语言的大部分编译器都提供了一种功能,允许在命令行当中定义符号,用于编译过程的程序,通常是在Linux环境下使用,在windows环境下一般是不可以的,那这个是什么意思呢?举个例子:

#include<stdio.h>intmain()
{
intarr[SIZE];
inti=0;
for(i=0;i<SIZE;i++)
    {
arr[i]=i;
    }
for(i=0;i<SIZE;i++)
    {
printf("%d" ,arr[i]);
    }
printf("\n");
return0;
}

可以看到上面的程序当中有一个没有初始化和定义的变量SIZE,那程序正常情况下是跑不起来的,是会报错的,那应该怎么在没有修改程序的情况下,让它跑起来,在Linux环境下面,可以在命令行规定,规定格式是这样的:

gcc-DSIZE=10test.c

这样编译器就会知道SIZE是10,程序就可以正常运行起来。

条件编译

> 在编译一个程序的时候,当我们有部分语句不需要的时候,可以进行注释,那有没有其他方法呢?有,可以用条件编译指令,那条件编译指令具体怎么使用,往下看:

#include<stdio.h>#define _ DEBUG _intmain()
{
inti=0;
intarr[10] = { 0 };
for(i=0; i<10;i++)
    {
arr[i] =i;
printf("%d", arr[i]);//为了知道上面的数是否放到数组里面    }
return0;
}


可以看到上面代码中,for循环内的printf是用于验证我们的数字成功放到了数组当中没有,那现在我们知道放成功了,不需要它了,但是又不想删除和注释,这个时候使用条件编译指令当中的一个:

#include<stdio.h>#define _ DEBUG _intmain()
{
inti=0;
intarr[10] = { 0 };
for(i=0; i<10;i++)
    {
arr[i] =i;
#ifdef _ DEBUF _//如果_ DEBUF _为真,进入到里面执行语句printf("%d", arr[i]);//为了知道上面的数是否放到数组里面#endif//结束标志    }
return0;
}


那这样写,对于_ DEBUF _,它的值是为假的,那就不会走ifdef,那就不会运行printf,这样就实现了我们不想删除也不想注释,但是让程序不跑某些代码的功能了,常见条件编译指令还有很有:

//1#if  //常量表达式//...#endif//这里的常量表达式由预处理求值//比如上面程序当中的_ DEBUG _,编译器会知道是什么,但是必须要提前声明//2.多个分支的条件编译#if //常量表达式//...#elif //常量表达式//...#else//...#endif//3.判断是否被定义#if defuned(symbol)#ifdef symbol#if !defined(symbol)#ifndef symbol//4.嵌套指令#if defined(OS_UNIX)#ifdef OPTION1unix_version_option1();
#endif#ifdef OPION2unix_version_option2();
#endif#elif defined(OS_MSDOS)#ifdef OPION2msdos_version_option2();
#ednif#endif

文件包含

我们知道#include是用于包含头文件的,在进入这个头文件的时候,就对头文件指向的文件进行了编译,这个时候在编译器眼里#include的地方就是包含的头文件的内容,所以,我们包含了多少次头文件,就会替换多少次,所以我们包含了多少次头文件,就编译了多少次头文件,所以最好不要重复包含同一个头文件很多次

头文件包含查找规则

在包含头文件的时候,我们发现,有两种包含方式,一种是<>,另一种是"",那它们两个包含方式有什么区别呢?

对于""而言,它会先在源文件所在目录下查找,如果没有找到这个头文件,编译器就像查找库函数头文件一样在标准位置查找头文件,如果没有在标准位置查找到,就提示编译错误,而标准位置就在编译器的下载目录当中,比如我用的vs2020,那标准位置就在我的vs2020的默认下载路径。

而<>,会直接在标准位置查找,找不到就报错,对于库函数的头文件,也可以用""来引,但是就会降低效率,因为本来就存放在标准位置,直接就可以查,但是用“”先查本地,相比较就会慢一点,而且也不容易区分本地的头文件和库函数的头文件,所以对于头文件用什么引,要根据情况而定。

嵌套文件包含


如上图所示,comn.h和comn.c是公共模板,test1.h和test1.c使用了公共模块,test2.h和test2.c也使用了公共模块,test.h和test.c使用了test1模块和test2的模块。

那这样test是不是同时包含了两份comn.h的内容,那就重复包含了,那有没有什么方法解决这个问题呢?使用条件编译,在每个头文件最前面加上条件编译指令,如下所示:

#ifdef _TEST_H_#define _TEST_H_//头文件包含的内容#endif

或者:

#pragma once


这样可以避免掉我们的头文件重复包含

其他预处理指令

还有一些预处理指令:

#error#pragma#line//...


相关文章
C4.
|
7月前
|
存储 算法 C语言
关于c语言用计算机语言表示算法
关于c语言用计算机语言表示算法
C4.
78 1
|
7月前
|
算法 数据库 C语言
简单谈谈我参加计算机二级C语言的考试感受
计算机二级c语言主要内容是熟练掌握C语言基础语法,了解常用数据结构和算法,能够使用C语言进行程序设计,编写简单的应用程序。 计算机二级C语言试卷类型: + 选择题 + 程序填空题 + 程序改错题 + 程序设计题 这四个部分组成,其中大题目的分数占60分。
73 0
|
2月前
|
C语言
初识C语言:与计算机的交流之输入与输出(scanf和printf)
初识C语言:与计算机的交流之输入与输出(scanf和printf)
182 0
|
2月前
|
存储 程序员 编译器
初识C语言,计算机语言的基石
初识C语言,计算机语言的基石
|
6月前
|
自然语言处理 编译器 程序员
【C语言基础】:编译和链接(计算机中的翻译官)
【C语言基础】:编译和链接(计算机中的翻译官)
|
5月前
|
存储 编解码 程序员
C语言17---计算机的存储规则
C语言17---计算机的存储规则
|
7月前
|
存储 算法 Serverless
22年+21年 计算机能力挑战赛初赛C语言程序题 题解
22年+21年 计算机能力挑战赛初赛C语言程序题 题解
158 2
|
7月前
|
Java Unix C语言
在我掉入计算机的大坑并深陷其中时,一门名为“C语言”的编程语言让我沉迷
在我掉入计算机的大坑并深陷其中时,一门名为“C语言”的编程语言让我沉迷
|
7月前
|
存储 算法 测试技术
通过一篇文章让你完全掌握计算机二级C语言的知识点
计算机二级C语言考试是许多计算机科学专业学生及编程爱好者的必经之路。它不仅是对基础编程知识的检验,更是对逻辑思维和问题解决能力的挑战。通过这门考试,考生需要掌握C语言的基本语法、数据类型、控制结构、函数、数组、指针以及文件操作等核心内容。 为了顺利通过计算机二级C语言考试,考生首先需要系统地学习C语言的基础知识。从变量和常量的定义开始,逐步深入到运算符的使用、条件语句和循环语句的应用。在学习过程中,不断通过编写小程序来巩固所学知识,比如计算两个数的和、判断一个数是否为素数等。
233 0
|
7月前
|
数据处理 C语言
【C语言宝库】- 操作符|详解进制转换|计算机小白必备技能(上)
【C语言宝库】- 操作符|详解进制转换|计算机小白必备技能(上)
75 0