您的位置:首页 > 编程语言 > C语言/C++

C语言<四> 函数与程序结构

2015-10-25 14:27 344 查看

函数的基本知识

如果函数定义中省略了返回值类型,则默认为int类型

返回值:如果某个函数从一个地方返回时有返回值,而从另一个地方返回时没有返回值,该函数并不非法,但可能是一种出问题的征兆。

程序的加载:不同系统中,保存多个源文件中的C程序的编译和加载机制是不同的,这里看下Unix系统,假设有三个函数分别存放在main.c getline.c strindex.c,则可以使用命令cc main.c getline.c strindex.c 来编译这三个文件,并把生成的目标代码分别放在文件main.o getline.o strindex.o中,然后再把这三个文件一起加载到可执行文件a.out中,cc命令使用”.c”,”.o”这两种扩展名来区分源文件与目标文件。

外部变量:外部变量定义在函数之外,因此可以在很多函数中使用,如果两个函数必须共享某些数据,而这两个函数互相不调用对方,这种情况下最方便的方式就是把这些共享数据定义为外部变量,而不是作为函数参数传递。可以通过一个加减法的例子来说明,

作用域规则:外部变量或函数的作用域从声明它的地方开始,到其所在的文件的末尾结束。注意如果要在外部变量的定义之前使用该变量,或外部变量的定义与变量的使用不在同一个源文件中,则必须在相应的变量声明中强制性地使用关键字extern,所以一般加了extern的就是变量的声明

变量声明和定义是不一样的,声明*用于说明变量的属性(主要是变量的类型)变量的定义除此之外还将引起存储器的分配

在一个源文件的所有源文件中,一个外部变量只能在某一个文件中定义一次,而其他文件可以通过extern声明来访问它,这里说一下,外部变量的定义必须指定数组的长度,但extern声明则不一定要指定数组的长度。下面举一个例子看看:函数push定义在file1文件中,而变量val定义在file2文件中并被初始化,则需要通过下面这些定义和声明把这些函数和变量绑定在一起:

在文件file1中:
extern int val;
void push();

在文件file2中
int val = 0;


头文件:对于某些中等规模的程序,最好只用一个头文件存放程序中各部分共享的对象,对于大型的程序则需要更多的头文件。

静态变量static关键字:如果函数声明为static类型,则该函数名除了对该函数声明所在的文件可见外,其他文件都无法访问;若static声明变量,则它将一直存在,并只会初始化一次,且不会随着函数的结束而消失。

寄存器变量:register声明告诉编译器,它所声明的变量在程序中使用频率较高。其思想是:将register变量放在寄存器中,这样可以使程序更小,执行速度更快。但编译器可以忽略此项。register声明只使用与自动变量以及函数的形式参数。(了解下就好)

初始化

在不进行显示初始化的情况下,外部变量和静态变量都被初始化为0,且都只初始化一次,且初始化表达式必须是常量表达式;而自动变量的初值则没有没有定义,且每次进入程序块或函数时都将被初始化,初始化表达式可以不是常量表达式

数组的初始化:如果初始化表达式的个数比数组元素少,对则外部变量、静态变量、自动变量来说,没有初始化表达式的元素将会被初始化为0;若比之多,则是错误的。

C预处理器

预处理器是编译过程中单独执行的第一个步骤,最常用的是:#include 和 #define

- include

#include “文件名” 或 #include <文件名> 若是用引号引起来的,则在源文件所在的位置查找该文件;如果用<>则按相应规则来查找文件

- 宏替换

如果一个较长的宏定义分成若干行,这时需要在待续的行末尾加*反斜杠*用于换行,注意宏定义可能出错哦,但是还是很有用的,如

#define dprint(expr) printf(#expr "=%g\n",expr)
dprint(x/y);
调用该宏时,被扩展为
printf("x/y" "=%g\n",x/y);
等价于
printf("x/y =%g\n",x/y);


预处理运算符##为宏扩展提供了一种连接实际参数的手段。如果替换文本中的参数与##相邻,则该参数将被实际参数替换,##与前后的空白符将被删除,并对替换后的结果重新扫描

#define paste(front,back) front ## back
paste(name,1) 就是name1


条件包含

可以使用条件语句对预处理本身进行控制,这种条件语句的值是在预处理执行的过程中进行计算。#if 语句对其中的常量整型表达式(其中不能包含sizeof、类型装换或enum常量),若该行不等于0,则包含其后的行,直到#endif、#elif或#else语句位置,在#if语句中可以使用#define .

下面看两个例子吧。

#if !defined(HDR)
#define HDR

hdr.h文件的内容放在这里

#endif


#if SYSTEM == SYSV
#define HDR "sysv.h"
#elif SYSTEM == BSD
#define HDR "bsd.h"
#elif SYSTEM == MSDOS
#define HDR "msdos.h"
#else
#define HDR "default.h"
#endif
#include HDR


第一个例子是为了避免重复包含,第二个例子根据变量的值确定包含哪个版本的头文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: