C语言中的小知识点(程序环境和预处理篇(1))

简介: C语言中的小知识点(程序环境和预处理篇(1))

前言

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

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

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

一、编译+链接是什么?

(一)、翻译环境

首先我们先以一幅图来导入我们本章其中的知识点。

64671f502bbc4966b457ea1af98c0815.png

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

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

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

二、预处理的讲解

1.预定义符号

f8c381d21211406ca94d4b4f7e724a1d.png

FILE //进行编译的源文件

LINE //文件当前的行号

DATE //文件被编译的日期

TIME //文件被编译的时间

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

此时我就带大家来测试一下关于vs这款微软制作的编辑器是否遵循ANSI C标准,我们会发现在vs这款编译器中是不支持这个标识符的,所以可以得出微软制作的这款vsstudio不是遵循ANSI C的

acd7108dbdd8452d911ab9e18c3fe3e0.png

2.#define定义标识符

语法:#define stu student

#define MAX 1000
#define reg register          //为 register这个关键字,创建一个简短的名字
#define do_forever for(;;)     //用更形象的符号来替换一种实现
#define CASE break;case        //在写case语句的时候自动把 break写上。
// 如果定义的 stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)。
#define DEBUG_PRINT printf("file:%s\tline:%d\t \
                          date:%s\ttime:%s\n" ,\
__FILE__,__LINE__ ,       \
__DATE__,__TIME__ )  

那么此时我就想提一个疑问出来了?在define定义标识符的时候,要不要在最后加上:?

如一下代码所示,我们发现在编译器上他是报错的,那么这是为什么呢?我很不解不是说define可以定义嘛?为什么这又不行了呢?其实在预编译的过程中它会转换成这样,我们可以想象一下正常情况下if如果有两条以上的语句,那么我们是不是需要加上括号呢?对没错,是的,我们需要加上,那是不是我们就在不经意之间,突然就犯了一个致命的错误,并且我们还不知道!

9475ec99b9754ed09ee36a728ae36ed5.png

#include<stdio.h>
#define MAX 1000;
#define reg register          //为 register这个关键字,创建一个简短的名字
#define do_forever for(;;)     //用更形象的符号来替换一种实现
#define CASE break;case        //在写case语句的时候自动把 break写上。
// 如果定义的 stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)。
#define DEBUG_PRINT printf("file:%s\tline:%d\t \
                          date:%s\ttime:%s\n" ,\
__FILE__,__LINE__ ,       \
__DATE__,__TIME__ )  
int main()
{
  int max = 0;
  if (1)
    max = MAX;
  else
    max = 0;
  return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0M8fIa9i-1681278852763)(ht

eeb7ad31264d45128ebd4997c50ac3d9.png

]

tps://img-blog.csdnimg.cn/b2bd2e4546814d598c00d195515f4c0b.png)

总结

以上就是今天要讲的内容,本文仅仅简单介绍了程序环境和预处理!我们下期再见!

目录
相关文章
|
1月前
|
编译器 C语言
C语言--预处理详解(1)
【10月更文挑战第3天】
|
1月前
|
编译器 Linux C语言
C语言--预处理详解(3)
【10月更文挑战第3天】
|
25天前
|
C语言
【c语言】你绝对没见过的预处理技巧
本文介绍了C语言中预处理(预编译)的相关知识和指令,包括预定义符号、`#define`定义常量和宏、宏与函数的对比、`#`和`##`操作符、`#undef`撤销宏定义、条件编译以及头文件的包含方式。通过具体示例详细解释了各指令的使用方法和注意事项,帮助读者更好地理解和应用预处理技术。
24 2
|
1月前
|
C语言
C语言学习笔记-知识点总结上
C语言学习笔记-知识点总结上
81 1
|
1月前
|
C语言
C语言--预处理详解(2)
【10月更文挑战第3天】
|
1月前
|
存储 文件存储 C语言
深入C语言:文件操作实现局外影响程序
深入C语言:文件操作实现局外影响程序
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
35 3
|
14天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
29 6
下一篇
无影云桌面