c语⾔⾼级编程电⼦书,《C语⾔⾼级编程》.pdf 《C语⾔⾼级编程》.pdf
C语⾔⾼级编程
概述
由⼏个测试程序说开去
预编译与宏
⾼级预编译介绍
宏的⾼级⽤法
变量
变量分类详细解析
我的变量去哪⼉了?
⼤⼩端对变量的影响
内存与指针
常见内存使⽤错误⼤观
指针,⼜是指针!
数据结构与链表
结构体之字节对齐,字段存贮,sizeof探讨
单链表与双链表
编译,链接与调试
编译器,连接器的作⽤
调试技巧⼩节
c语言如何去学编写⾼效⽆错代码
嵌⼊式⾼效代码修炼法则
如何编写⽆错代码
(⼩测试)
1.已知#define A “menu”
#define B “osd”,
若请使⽤宏A,B表⽰出字符串”menuosd”
2. 请表述下列定义中的声明表⽰什么意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
3 .关键字volatile有什么含意并给出三个不同的例⼦
4 评价下⾯的代码⽚断:
unsigned int zero = 0;
unsigned int compzero = 0xFFFF;
/*1's complement of zero */
答案:
1 答案1:#define C A B
答案2 :#define _C_(a,b) a##b
#define C(a,b) _C_(a,b)
2 const int a; //常整型数
int const a;//常整型数
const int *a;//指向常整型数的指针(整型数不可修改,指针可以)
int * const a;//指向整型数的常指针(整型数可以修改,指针不可改)
int const * a const;//指向常整型数的常指针(整型数和指针都不可以改)
3⼀个定义为volatile 的变量是说这变量可能会被意想不到地改变,这样,编译
器就不会去假设这个变量的值了。精确地说就是,优化器在⽤到这个变量时必
须每次都⼩⼼地重新读取这个变量的值,⽽不是使⽤保存在寄存器⾥的备份。
1). 并⾏设备的硬件寄存器(如:状态寄存器)
2). ⼀个中断服务⼦程序中会访问到的⾮⾃动变量(Non-automatic variables)
3). 多线程应⽤回答不出这个问题的⼈是不会被雇佣的。我认为这是区分C程
序员和嵌⼊式系统程序员的最基本的问题。嵌⼊式系统程序员经常同硬件、中断、RTOS等等打交道,所⽤这些都要求volatile变量。不懂得volatile 内容将会带来灾难。
4 int类型的字长是与机器相关的,应该写为
unsigned int compzero = ~0;
预编译与宏
预处理器的主要作⽤就是把通过预处理的内建功能对⼀个资源进⾏等价替
换,最常见的预处理有:⽂件包含,条件编译、布局控制和宏替换4种。
⽂件包含:#include 是⼀种最为常见的预处理,主要是做为⽂件的引⽤组合
源程序正⽂。
条件编译:#if,#ifndef,#ifdef,#endif,#undef等也是⽐较常见的预处理,主要是进⾏编译时进⾏有选择的挑选,注释掉⼀些指定的代码,以达到版本控制、
防⽌对⽂件重复包含的功能。
布局控制:#progma ,这也是我们应⽤预处理的⼀个重要⽅⾯,主要功能是
为编译程序提供⾮常规的控制流信息。
宏替换:#define ,这是最常见的⽤法,它可以定义符号常量、函数功能、重新命名、字符串的拼接等各种功能。
下常见的预处理指令:
#define 宏定义
#undef 未定义宏
#include ⽂本包含
#ifdef 如果宏被定义就进⾏编译
#ifndef 如果宏未被定义就进⾏编译
#endif 结束编译块的控制
#if 表达式⾮零就对代码进⾏编译
#else 作

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。