`

C语法总结 基础语法和编写大型程序

 
阅读更多

 

 

源文件和头文件

源文件的扩展名是 .c 结尾,每个源文件包含函数和变量定义,其中一个源文件包含main()函数

多个源文件可以共享一些变量和函数,通过#include指令包含进来,这种包含的文件就是 头文件,扩展名是.h

//用于引入c语言自身的系统头文件
#include <文件名>

//用于引进自定义的头文件
//不要在自定义的头文件中使用尖括号,系统会在指定的环境变量中找对应的函数,
//这样肯定是找不到的
#include "文件名"

//#include记号方式,判断是否定义了一些特定的宏,之后根据这些宏定义引入
//对应的头文件
#if defined (IA32)
    #define CPU_FILE "ia32.h"
#elif defined (IA64)
    #define CPU_FILE "ia64.h"
#elif defined (AMD64)
    #define CPU_FILE "amd64.h"
#endif
#include CPU_FILE


//保护头文件
//假设file1.h 包含了file3.h
//file2.h 保护了file3.h
//prog.c 同时包含了file1.h 和 file2.h
//两次包含同一个头文件不总是会导致编译错误。如果文件只包含宏定义,函数
//原型和变量声明,那么不会有问题,但如果包含类型定义则会编译出错
//防止头文件多次包含,可以用#ifndef 和 #endif质量来封闭文件的内容
#ifndef BOOLEAN_H
#define BOOLEAN_H
#define   TRUE  1
#define    FALSE  0
    typedef  int Bool;
#endif
//首次包含这个文件时没有定义BOOLAN_H所以预处理器允许保留#ifnedf和#endif之间的多行内容。但如果再次包含此文件,那么预处理将把#ifnedf和#endif之间的多行内容删除


//#error指令经常放在头文件中,用来检测不应该包含头文件的条件,如头文件
//中用到了一个最初在C89标准之前不存在的特性,为了避免把头文件用于旧的
//非标准编译器,可以在头文件中包含#ifdef指令来检查__STDC__宏
#ifnedf __STDC__
#error This header requires a Standard C compiler
#endif

 

头文件可以共享函数原型

    当调用在其他文件中定义的函数fun时。要始终确保编译器在调用之间已看到函数的原型,如果没 有编译器可能会返回默认的int类型并假定形参数量和函数fun调用中的实际参数是匹配的

共享变量声明

头文件也可以包含#include指令,即包含其他头文件

 

 

构建多文件程序

1.编译,必须对程序中每个源文件分别进行编译(不需要编译头文件,编译包含头文件的源文件时会自动编译

              头文件中的内容)。对于每个源文件,编译器会产生一个包含目标代码的文件。这些文件成为

              目标文件,在unix系统中的扩展名为.o,在windows系统中的扩展名为.ojb

2.链接,连接器把上一步产生的目标文件和库函数的代码结合在一起生成可执行的程序。连接器的一个职责

              是要解决编译器遗留的外部引用问题(外部引用发生在一个文件中的函数调用另一个文件中定义的

              函数或者访问另一个文件中定义的变量时)

 

makefile

justify: justify.o    word.o    line.o
            gcc -o justify    justify.o    word.o    line.o
justify.o: justify.c     word.h    line.h
               gcc -c justify.c
word.o:  word.c    word.h
               gcc -c word.c
line.o:  line.c  line.h
            gcc - c line.c

每组成为一条规则,每条规则的第一行给出了目标文件,跟在后便的是它所依赖的文件

第二行是执行的命令(当目标文件所依赖的文件发生改变时,需要重新构建目标文件,此时执行第二行命令)

执行make:
make 目标
make justify
makt install
如果没有在调用make的时候执行目标文件,将构建第一条规则中的目标文件

 

编译期间的错误

1.拼写错误, 如果变量名或函数名拼写错误,那么连接器将进行缺失报告。列如,在程序中定义了函数

   read_char,但调用时却把它写为read_cahr,那么链接器将报告说缺失read_char函数

2.缺失文件,  如果连接器不能找到文件foo.c中的函数,那么它可能不回知道此文件。这时就要检查makefile

   或工程文件来确保foo.c文件是列出了的。

3.缺失库, 链接器不可能找到程序中用到的全部库函数,unix系统中有一个使用了<math.h>的经典例子,在

   程序中简单的包含该头文件是不够的,很多unix版本要求在链接程序时指明选项-lm,这会导致连接器去

   搜索一个包含<math.h>函数的编译器版本的系统文件。不适用这个选项可能会在链接时导致

   "undefined reference"消息。

 

在程序外定义宏

大多数编译器,包括GCC,支持-D选项,允许用命令行来指定宏的值

gcc -DDEBUG=1 foo.c

在这个例子中,定义宏DEBUG在程序foo.c中的值为1,其效果相当于在foo.c的开始出这样写

#define DEBUG 1

如果-D选项命名的宏没有指定值,那么这个值被设置为1

许多编译器也支持-U选项,这个选项用于删除宏的定义,效果相当于#undef,我们可以使用-U选项来删掉

预定义宏或之前在命令行方式下用-D选项定义的宏。

 

 

实现面向对象的封装性

#define    publ/ic    /* empty */
#define    private  static

private void terminate(const char *message) { ....}
public bool is_empty(void){....}

 

 

 

C语言的关键字

auto break case char const continue
default do double else enum extern
float for goto if int long
register return short signed sizeof static
struct switch typedef union unsigned void
volatile while

//1999年12月16日,ISO推出了C99标准,该标准新增了5个C语言关键字:
inline restrict _Bool _Complex _Imaginary
//(注意bool 从来不是C语言的关键字)

//2011年12月8日,ISO发布C语言的新标准C11,该标准新增了7个C语言关键字:
_Alignas _Alignof _Atomic _Static_assert _Noreturn _Thread_local _Generic

 

 

 

 

C89的标准库

头文件名 含义
<assert.h> 诊断,允许我们在程序中插入自我检查,一旦任何检查失败,程序会被终止
<ctype.h> 字符处理,提供用于字符分类及大小写转换的函数
<errno.h>

浮点类型的特征,提供errno,这是一个左值,可以在调用特定库函数后进行检查,

来判断调用过程中是否有错误发生

<limits.h> 整数类型的大小,提供了用于描述整数类型特征的宏,包括他们的最大值和最小值
<locale.h>

本地化,提供了一些函数帮助程序针对某个国家或地区的特定行为方式。这些与本地化相关

的行为包括显示数字的方式,货币的格式,字符集以及日期和时间的表示行为

<math.h>

数学计算,提供了常见的数学函数,包括三角函数,双曲函数,指数函数,对数函数,

幂函数,邻近取整函数,绝对值运算函数以及取余函数

<setjmp.h>

非本地跳转,提供了setjmp函数和longjmp函数,setjmp函数会标记程序中的一个位置,随后

可以用longjmp返回被标记的位置。这些函数可以用来从一个函数跳转到另一个函数中,而

绕过正常的函数返回机制,setjmp和longjmp函数主要来处理程序执行过程中出现的严重行为

<signal.h>

信号处理,提供了用于处理异常情况(信号)的函数,包括中断和运行时错误,signal函数可以

设置一个函数,使系统会在给定信号发生后自动调用该函数;raise函数用来产生信息

<stdarg.h> 可变参数,提供了一些工具用于编写数个数可变函数,就像printf和scanf一样
<stddef.h> 常用定义,提供了经常使用的类型和宏的定义
<stdio.h> 输入输出,提供了大量的输入/输函数,包括对顺序访问和随机访问文件的操作
<stdlib.h>

常用实用程序,包括了大量无法规划其他头的函数,如可以将字符串转换成数,产生伪随机

数,执行内存管理任务,与操作系统通信,执行搜索与排序,以及在多字节字符与宽字符

之间进行转换

<string.h>

字符串处理,提供了用于进行字符串操作(复制,拼接,比较及搜索)的函数以及对任意内存

块进行操作的函数

<time.h>

日期和时间,提供了相应的函数来获取时间(和日期),操纵时间,以及格式化时间的显示

 

 

 

C99标准库

头文件 含义
<complex.h>

复数算术,定义了complex和I 宏,这两个宏对于复数运算来说非常有用,该头还提供了

对复数进行数学运算的函数

<fenv.h>

浮点环境,提供了对浮点状态标志和控制模式的访问,如程序可以测试标志来判断浮点数

运算过程中是否发生了溢出,或者设置控制模式来指定如何进行取整。 

 <inttypes.h>

整数类型格式转换,定义了可用于<stdint.h>中声明的整数类型的输入/输出的格式化

字符串的宏,还提供了处理最大宽度整数的函数 

 <iso646.h>

拼写转换,定义了可代表特定运算符(包含字符&,|,~,!和^)的宏,当编程环境的本地

字符集没有这些字符时,这些宏非常有用

 <stdbool.h>

布尔类型和值,定义了bool,true,false宏,同时还定义了一个可以用于测试这些宏是否

已经被定义的宏 

 <stdint.h>

整数类型,声明了指定宽度的整数类型并定义了相关的宏(如指定每种类型的最大和最小

值的宏)。同时定义了用于构建具体类型的整数常量的带参数的宏 

 <tgmath.h>

泛型数学,在C99中<math.h>和<complex.h>头仲的许多数学函数都有多个版本。

<tgmath.h>头仲的泛型宏可以检测传递给他们的参数和类型,并替代为相应<math.h>或

<complex.h>中函数的调用 

 <wchar.h> 扩展的多字节和宽字符实用工具,提供了宽字符输入/输出和宽字符串操作的函数 
 <wctype.h> 宽字符分类和映射实用工具,<wctype.h>头是<ctype.h>的宽字符版本,提供了对宽字符进行分类和修改的函数 

 

 

参考:

C语言关键字

C语言的32个关键字

 

 

分享到:
评论

相关推荐

    C语言程序设计(第四版)笔记

    第一章 概述 1. C语言的特点 ①语言简洁、紧凑,使用方便、灵活。共有32个关键字,9种控制语句。 ②运算符丰富,公有34种运算符。 ③数据结构丰富,数据类型有:整型、...现在很多大型应用软件也用C编写。

    c语言编写单片机技巧

    答:对于复杂而开发时间紧的项目时,可以采用C语言,但前提是要求对该MCU系统的C语言和C编译器非常熟悉,特别要注意该C编译系统所能支持的数据类型和算法。虽然C语言是最普遍的一种高级语言,但不同的MCU厂家其...

    Python语言程序设计习题答案.zip

    面向过程的程序设计方法难以保证程序的安全性和代码的可重用性,而面向对象的程序设计方法能够更好地提高大型程序的质量和开发效率,增强程序的安全性和提高代码的可重用性。学习本章,重在理解面向对象程序设计思想...

    Python语言程序设计PPT课件.zip

    面向过程的程序设计方法难以保证程序的安全性和代码的可重用性,而面向对象的程序设计方法能够更好地提高大型程序的质量和开发效率,增强程序的安全性和提高代码的可重用性。学习本章,重在理解面向对象程序设计思想...

    Python 变量的引用-调用函数传递实参的引用

    Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被人们用于独立的、大型项目的开发和设计 Python解释器易于扩展,...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

     李文娟,中国石油大学(华东)硕士,现供职于国家行政学院,工作后一直从事软件开发和软件项目管理工作,对计算机语言、计算机体系结构、操作系统都非常熟悉,尤其是精通C和C++编程技术. 目录 封面 -19 封底 -18 扉页...

    零基础学Visual.Basic.6(PPT)

    包括开发环境介绍、获取帮助信息的方法、基础语法、窗体控件、高级ActiveX控体、数组,键盘鼠标事件、菜单、工具栏和状态栏的设计、文件处理技术、SQL语言基础、数据库控件编c程、ADO数据库编程、网络编程、多媒体...

    C#微软培训资料

    18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...

    RED HAT LINUX 6大全

    5.1.4 使用GNOME客户程序和工具 63 5.1.5 使用GNOME Control Center配置 桌面 64 5.1.6 GNOME面板配置 65 5.2 Enlightenment窗口管理器特性 67 5.3 K桌面环境特性 68 5.3.1 安装组件 68 5.3.2 使用kdm登录 68 5.3.3...

    Java-Series:Java-Series, Notes & Examples. | 语法基础、数据结构、工程实践、设计模式、并发编程、JVM、Scala

    一是以 IBM,SUN 和 HP 的 UNIX 服务器和大型机为主的异构环境,C/C++ 和其它语言编写的应用跨平台支持和移植比较困难,二是基于 CGI 和其它技术的网络应用从开发效率和功能性角度来看都不够理想,三是 C/C++在当时...

    LUA5.1 脚本语言 编译执行源码

    Lua从一开始就是作为一门方便嵌入(其它应用程序)并可扩展的轻量级脚本语言来设计的,因此她一直遵从着简单、小巧、可移植、快速的原则,官方实现完全采用ANSI C编写,能以C程序库的形式嵌入到宿主程序中。...

    informix 实用大全

    本书由专业Informix用户、数据库管理员、Informix管理员和应用程序开发员编写而成,把各大Informix产品的方方面面综合、深入地集中在一起,包括最新Informix产品的详细信息,如Informix Internet Foundation.2000...

    嵌入式\(高校应用案例)北航软件学院

    ZKQ090103 Linux 开发环境与应用程序设计 Linux C 编程基础,gdb调式器,Makefile文件概述;Linux系统调用原理;基于系统调用的文件I/O操作;文件上锁,程序机制与功能,特殊文件的操作;串口编程,串口通信的实现;...

    如何编写Makefile

    在这篇文档中,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编译的知识,相关于这方面的内容,还请各 位查看相关的编译器的文档。这里所默认的编译器是UNIX 下的GCC 和CC。 关于程序的编译和链接

    软件工程-理论与实践(许家珆)习题答案

    C) 包括程序和文档  D) 可独立构成计算机系统 2. 软件工程三要素是(C D)。 A) 技术、方法和工具  B) 方法、工具和过程  C) 方法、对象和类  D) 过程、模型、方法 3. 包含风险分析的软件工程...

    D语言简易教程

    它与C二进制兼容(不完全),可编译为本地码,有GC也可手动管理内存,语法上借鉴多种语言,模板则 在C++的基础上做了相当大的扩充。D 语言既有 C 语言的强大威力,又有 Python 和 Ruby 的开发效率。它是一种集垃圾...

    Rust-Series:Rust Series,语法基础、数据结构、并发编程、工程实践,常见的代码示例 & 数据结构与算法

    当我们需要编写接近实时高性能,稳健,并有足够开发效率的大程序时,譬如数据库、交易系统、大型桌面应用等,往往会首先选择 C 或者 C++。这种情况下我们往往有以下考量: 不需要自动垃圾回收(GC),避免因为垃圾回收...

    本科毕业设计开题报告(学生实习信息管理系统的设计与实现)

    本系统使用的开发语言是c#语言,C#语言是一种优秀的面向对像程序设计语言,它在C语言的基础上发展而来,但它比C语言更容易为人们学习和掌握。C#以其独特的语言机制在计算机科学的各个领域中得到了广泛的应用。面向...

    JAVA上百实例源码以及开源项目

     Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构,  当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket...

    JAVA上百实例源码以及开源项目源代码

     Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构,  当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket...

Global site tag (gtag.js) - Google Analytics