首页 > 编程语言 >c语言—程序环境和预处理进阶篇—笔记

c语言—程序环境和预处理进阶篇—笔记

时间:2022-10-26 12:37:01浏览次数:77  
标签:__ 编译 endif 笔记 进阶篇 ifdef DEBUG 预处理 define

这章是一个c语言底层逻辑的总览,比较接近硬件,不难理解,这里给大家推荐一个c语言的在线练习网站​​https://www.dotcpp.com/oj/problemset.html​

因为只有通过大量的练习才能真正掌握c语言!

因为只有通过大量的练习才能真正掌握c语言!

​因为只有通过大量的练习才能真正掌握c语言!

所以,大家务必大量练习。

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

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

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

2.编译+链接

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

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

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

sum.c

int g_val = 2016;
void print(const char *str)
{
printf("%s\n", str);
}

test.c

#include <stdio.h>
int main()
{
extern void print(char *str);
extern int g_val;
printf("%d\n", g_val);
print("hello bit.\n");
return 0;
}

VIM学习资料

简明VIM练级攻略:

​https://coolshell.cn/articles/5426.html ​

给程序员的VIM速查卡

​https://coolshell.cn/articles/5479.html​

3.预处理

__FILE__ //进行编译的源文件
__LINE__ //文件当前的行号
__DATE__ //文件被编译的日期
__TIME__ //文件被编译的时间
__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义

#define

语法:
#define name stuff
#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 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏(define macro)

#define SQUARE( x ) x * x

条件编译

#include <stdio.h>
#define __DEBUG__
int main()
{
int i = 0;
int arr[10] = {0};
for(i=0; i<10; i++)
{
arr[i] = i;
#ifdef __DEBUG__
printf("%d\n", arr[i]);//为了观察数组是否赋值成功。
#endif //__DEBUG__
}
return 0;
}
//常见的条件编译指令:
1.
#if 常量表达式
//...
#endif
//常量表达式由预处理器求值。
如:
#define __DEBUG__ 1
#if __DEBUG__
//..
#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

4.其他预处理指令

#error
#pragma
#line
...
不做介绍,自己去了解。
#pragma pack()在结构体部分介绍。

参考《C语言深度解剖》学习

标签:__,编译,endif,笔记,进阶篇,ifdef,DEBUG,预处理,define
From: https://blog.51cto.com/chen8866/5797786

相关文章

  • LeetCode 566重塑矩阵 指针操作理解笔记
    LeetCode566重塑矩阵指针操作理解笔记题目来源:力扣题库(LeetCode)566.重塑矩阵前言:本来刚看到题目的时候,我是很开心的,这题不就是把二维数组“排扁”成一维数组,然后......
  • JavaScript高级程序设计笔记12 BOM
    BOMBOM的核心——window对象窗口和弹窗location对象——页面信息navigator对象——浏览器信息history对象——浏览器历史记录BOM是使用JavaScript开发Web应用程序的......
  • 详解决策树-分类树【菜菜的sklearn课堂笔记】
    文章换行有问题,望谅解视频作者:菜菜TsaiTsai链接:【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili关键概念:节点根节点:没有进边,有出边。包含......
  • 算法分析笔记----wsdchong
    时间:2018/12/20一、算法概述什么是算法1.算法:为一个计算的具体步骤;常用于计算、数据处理、推理等性质:有限、确定、可行、输入、输出;目的:解决问题(问题定义了输入和输出)2.例子......
  • 网站开发的基础知识笔记--wsdchong
    时间:2020/4/21前言:对HTTP的了解、对cookie和session的了解、response和request对象的了解一、对HTTP的了解1概述:HTTP(超文本传输协议Hypertexttransferprotocol)。超文本:不......
  • 用SSM框架开发新闻发布管理系统笔记--wsdchong
    前言:在整合三大框架的基础上实现系统后台的用户管理、用户登录、登录验证、新闻发布管理。前台页面使用jQuery+bootstrap框架完成新闻展示;一、系统概述1系统功能需求:用户管......
  • SpringMVC学习笔记--wsdchong
    前言:SpringMVC入门、SpringMVC数据绑定、JSON数据交互和RESTful支持、拦截器、SSM框架整合、一、SpringMVC入门1SpringMVC是spring提供的一个轻量级web框架,实现了webMVC设计......
  • MyBatis学习笔记--wsdchong
    前言:学编程和学绘画一样,都是从模仿开始。初识mybatis、mybatis的核心配置、动态SQL、mybatis的关联映射、与spring的整合。 一、初识mybatis概念:1mybatis是一个支持普通SQL......
  • JSP笔记以及理解
    时间:2020/4/21前言:课件笔记、JSP的缺点笔记来源:老师的课件一、课件笔记1JSP(Javaserverpages)是一种用于开发动态网页的技术,文件后缀名是.jsp在JSP页面中可以嵌套Java代码,为......
  • C程序设计(谭浩强)学习笔记——杂叙
    第一章1.程序:一组计算机能识别和执行的指令;2.机器语言(1,0组成);汇编语言(低级语言);高级语言(面向过程、面向对象);第二章1.程序主要包括两方面的信息:数据结构(对数据的描述)、算法(对......