- 浏览: 102665 次
- 性别:
- 来自: 北京
文章分类
最新评论
编译和链接
1.编译并链接一个完全包含于一个源文件的C程序
cc program.c
2.编译并链接几个C源文件
cc main.c sort.c lookup.c
3.编译一个源文件,并把他和现存的目标文件链接在一起
cc main.o. lookup.o sort.c
4.编译单个C源文件,并产生一个目标文件,以后再进行链接
cc -c program.c
5.编译几个C源文件,并为每个文件产生一个目标文件
cc -c main.c sort.c lookup.c
6.链接几个目标文件
cc main.o sort.o lookup.o
关键字:auto、static、register、const、volatile 、extern
auto
这个这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的。
register
这个关键字命令编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。
static
常见的两种用途:
1>统计函数被调用的次数;
2>减少局部数组建立和赋值的开销.变量的建立和赋值是需要一定的处理器开销的,特别是数组等含有较多元素的存储类型。在一些含有较多的变量并且被经常调用的函数中,可以将一些数组声明为static类型,以减少建立或者初始化这些变量的开销.
详细说明:
1>、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
2>、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。
3>当static用来修饰全局变量时,它就改变了全局变量的作用域,使其不能被别的程序extern,限制在了当前文件里,但是没有改变其存放位置,还是在全局静态储存区。
使用注意:
1>若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
2>若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
3>设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题(只要输入数据相同就应产生相同的输出)。
const
被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。它可以修饰函数的参数、返回值,甚至函数的定义体。
作用:
1>修饰输入参数
a.对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是提高效率。例如将void Func(A a) 改为void Func(const A &a)。
b.对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void Func(int x) 不应该改为void Func(const int &x)。
2>用const修饰函数的返回值
a.如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。
如对于: const char * GetString(void);
如下语句将出现编译错误:
char *str = GetString();//cannot convert from 'const char *' to 'char *';
正确的用法是:
const char *str = GetString();
b.如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。 如不要把函数int GetInt(void) 写成const int GetInt(void)。
3>const成员函数的声明中,const关键字只能放在函数声明的尾部,表示该类成员不修改对象.
volatile
表明某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。它可以适用于基础类型如:int,char,long......也适用于C的结构和C++的类。当对结构或者类对象使用volatile修饰的时候,结构或者类的所有成员都会被视为volatile.
该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被多个线程修改,而程序通过该变量同步各个线程。
简单示例:
DWORD __stdcall threadFunc(LPVOID signal)
{
int* intSignal=reinterpret_cast(signal);
*intSignal=2;
while(*intSignal!=1)
sleep(1000);
return 0;
}
该线程启动时将intSignal 置为2,然后循环等待直到intSignal 为1 时退出。显然intSignal的值必须在外部被改变,否则该线程不会退出。但是实际运行的时候该线程却不会退出,即使在外部将它的值改为1,看一下对应的伪汇编代码就明白了:
mov ax,signal
label:
if(ax!=1)
goto label
对于C编译器来说,它并不知道这个值会被其他线程修改。自然就把它cache在寄存器里面。C 编译器是没有线程概念的,这时候就需要用到volatile。volatile 的本意是指:这个值可能会在当前线程外部被改变。也就是说,我们要在threadFunc中的intSignal前面加上volatile关键字,这时候,编译器知道该变量的值会在外部改变,因此每次访问该变量时会重新读取,所作的循环变为如下面伪码所示:
label:
mov ax,signal
if(ax!=1)
goto label
注意:一个参数既可以是const同时是volatile,是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
extern
extern 意为“外来的”···它的作用在于告诉编译器:有这个变量,它可能不存在当前的文件中,但它肯定要存在于工程中的某一个源文件中或者一个Dll的输出中。
1.编译并链接一个完全包含于一个源文件的C程序
cc program.c
2.编译并链接几个C源文件
cc main.c sort.c lookup.c
3.编译一个源文件,并把他和现存的目标文件链接在一起
cc main.o. lookup.o sort.c
4.编译单个C源文件,并产生一个目标文件,以后再进行链接
cc -c program.c
5.编译几个C源文件,并为每个文件产生一个目标文件
cc -c main.c sort.c lookup.c
6.链接几个目标文件
cc main.o sort.o lookup.o
关键字:auto、static、register、const、volatile 、extern
auto
这个这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的。
register
这个关键字命令编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。
static
常见的两种用途:
1>统计函数被调用的次数;
2>减少局部数组建立和赋值的开销.变量的建立和赋值是需要一定的处理器开销的,特别是数组等含有较多元素的存储类型。在一些含有较多的变量并且被经常调用的函数中,可以将一些数组声明为static类型,以减少建立或者初始化这些变量的开销.
详细说明:
1>、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
2>、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。
3>当static用来修饰全局变量时,它就改变了全局变量的作用域,使其不能被别的程序extern,限制在了当前文件里,但是没有改变其存放位置,还是在全局静态储存区。
使用注意:
1>若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
2>若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
3>设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题(只要输入数据相同就应产生相同的输出)。
const
被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。它可以修饰函数的参数、返回值,甚至函数的定义体。
作用:
1>修饰输入参数
a.对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是提高效率。例如将void Func(A a) 改为void Func(const A &a)。
b.对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void Func(int x) 不应该改为void Func(const int &x)。
2>用const修饰函数的返回值
a.如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。
如对于: const char * GetString(void);
如下语句将出现编译错误:
char *str = GetString();//cannot convert from 'const char *' to 'char *';
正确的用法是:
const char *str = GetString();
b.如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。 如不要把函数int GetInt(void) 写成const int GetInt(void)。
3>const成员函数的声明中,const关键字只能放在函数声明的尾部,表示该类成员不修改对象.
volatile
表明某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。它可以适用于基础类型如:int,char,long......也适用于C的结构和C++的类。当对结构或者类对象使用volatile修饰的时候,结构或者类的所有成员都会被视为volatile.
该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被多个线程修改,而程序通过该变量同步各个线程。
简单示例:
DWORD __stdcall threadFunc(LPVOID signal)
{
int* intSignal=reinterpret_cast(signal);
*intSignal=2;
while(*intSignal!=1)
sleep(1000);
return 0;
}
该线程启动时将intSignal 置为2,然后循环等待直到intSignal 为1 时退出。显然intSignal的值必须在外部被改变,否则该线程不会退出。但是实际运行的时候该线程却不会退出,即使在外部将它的值改为1,看一下对应的伪汇编代码就明白了:
mov ax,signal
label:
if(ax!=1)
goto label
对于C编译器来说,它并不知道这个值会被其他线程修改。自然就把它cache在寄存器里面。C 编译器是没有线程概念的,这时候就需要用到volatile。volatile 的本意是指:这个值可能会在当前线程外部被改变。也就是说,我们要在threadFunc中的intSignal前面加上volatile关键字,这时候,编译器知道该变量的值会在外部改变,因此每次访问该变量时会重新读取,所作的循环变为如下面伪码所示:
label:
mov ax,signal
if(ax!=1)
goto label
注意:一个参数既可以是const同时是volatile,是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
extern
extern 意为“外来的”···它的作用在于告诉编译器:有这个变量,它可能不存在当前的文件中,但它肯定要存在于工程中的某一个源文件中或者一个Dll的输出中。
发表评论
-
net-snmp相关
2012-08-06 17:39 750final TransportMapping ... -
IBM网站的一些帖子
2012-05-18 14:18 0http://www.ibm.com/developerwor ... -
freeradius-server-2.1.12.tar.bz2+suse10 64+Oracle11配置
2012-04-26 21:47 2106使用的环境 freeradius-server-2.1.12. ... -
<java并发编程实践>第七章读书笔记
2012-04-25 09:02 0s -
ssss
2012-04-19 17:25 0int main(void) { int soc ... -
linux socket
2012-04-19 17:23 0http://blog.csdn.net/stevexk/ar ... -
C语言基本知识点2
2012-04-11 21:05 880scanf() getchar() gets() ----- ... -
cccccc
2012-04-11 15:36 0strlen() scanf() printf() ge ... -
我的第一个和第二个C语言程序
2012-04-10 20:27 764花了我超过6个小时呢,不容易哦。 #include< ... -
如何计算一个对象的大小
2012-04-09 14:36 0http://blog.csdn.net/hoszb/arti ... -
jvm调优
2012-03-29 19:21 0http://blog.csdn.net/cuker919/a ... -
linux c
2012-03-13 18:15 0http://blog.csdn.net/muge0913/a ... -
sss3
2012-03-10 11:00 0答案就在下面: 因为gnetAppService居然不是单例. ... -
sss2
2012-03-10 10:53 0at org.springframework.beans.fa ... -
ssss
2012-03-10 10:51 01、 因为两个环境一个可以正常启动,一个不正常。怀疑两个环境的 ... -
为最大发挥软件性能,建议对eclipse(eclipse.ini 文件)作以下配置
2012-02-29 20:17 0为最大发挥软件性能,建议对eclipse(eclipse.in ... -
尚珊珊
2012-02-25 13:08 0http://software.intel.com/zh-cn ... -
三种排序方法
2012-02-16 19:38 0http://blog.csdn.net/fenglibing ... -
安全8
2012-02-10 19:08 0安装时提供配置界面,用户可以修改FTP的密码支持的FTP密码修 ... -
安全7
2012-02-10 19:08 0禁止在代码中存储敏感数据 禁止在代码中存储如数据库连接 ...
相关推荐
标题和描述部分提到的“C语言复习知识点.pdf”意味着接下来的内容将涵盖C语言编程的一些基础知识点。根据提供的部分内容,我们将对以下几个方面进行详细的阐述: 1. C语言基本语法:包括变量、数据类型、运算符、...
根据提供的文件信息,以下是对C语言重要知识点的详细总结: 1. C语言基础语法:包括关键字、标识符、变量、数据类型、运算符和表达式。 2. 数据类型:C语言中定义了多种数据类型,包括整型、浮点型、字符型等。例如...
C语言知识点总结涉及了C语言的基础和核心概念,详细知识点...以上知识点是C语言编程中最基本、最常见的概念和技术,是掌握C语言编程的基础。在实际编程中,熟练掌握和灵活运用这些知识点是编写高效、稳定C程序的关键。
根据提供的文件信息,可以看出该文档内容涉及到C语言编程的核心概念,但由于OCR扫描识别可能存在的误差,我将尽力推断并阐述C语言中关于程序结构的重要知识点,包括顺序结构、选择结构和循环结构。 首先,程序结构...
以下是对C语言知识点的详细总结: 1. **基本语法与数据类型** - C语言的语句结构包括声明、表达式和控制结构。 - 数据类型包括基本类型(如int, float, double, char)和复合类型(如struct, union)。 - 变量的...
《C51单片机及C语言知识点必备秘籍》是一本专为嵌入式系统开发者设计的指南,尤其适合初学者和有一定基础的工程师。这本书深入浅出地讲解了C语言在C51单片机上的应用,帮助读者掌握在微控制器环境下编程的核心技能。...
本文总结了C语言程序设计的基本知识点,包括C语言基本知识、语句种类、运算符、表达式、数据类型、选择结构等。 一、C语言基本知识 * C语言源程序的框架:编译预处理、主函数main()、函数n()等 * C语言源程序的...
本文为你提供了2024年最全面的C语言面试题集锦,覆盖了从基础到高级的各类C语言知识点。内容涉及C语言的基本结构、数据类型、变量和常量、运算符、控制语句、函数、数组、指针、结构体和联合体等基础概念,以及动态...
本知识点总结将围绕C语言的基础知识、结构、数据类型、运算符、预处理和程序设计基础等方面展开。 首先,C语言程序的基本结构包括顺序结构、选择结构(分支结构)和循环结构。顺序结构就是程序按照编写顺序依次执行...
数据结构C语言版知识点,严蔚敏版数据结构书籍
这个压缩包“C语言学习者福利(二级C语言知识点速记).rar”提供了丰富的学习资源,帮助考生有效地备考。 首先,我们要明确C语言的基础构成,它包括以下几个核心概念: 1. **基本语法**:C语言的语法简洁明了,...
这份"C语言知识点总结【完美版】"的文档涵盖了C语言的核心概念,是学习和复习C语言的宝贵资源。以下是对该文档中可能包含的重要知识点的详细解释: 1. **基本数据类型**:C语言有几种基本的数据类型,包括整型(如...
这篇“C语言知识点入门笔记+实验代码”涵盖了C语言学习的核心内容,对于初学者来说是宝贵的资源。以下是一些主要的知识点: 1. **基础语法**:C语言的基础包括变量、数据类型、常量、运算符和表达式。变量是存储...
《2022山西专升本C语言知识点总结》 C语言是一门基础且重要的编程语言,对于山西专升本的学生来说,掌握其核心知识点至关重要。以下是对C语言的详细解读,包括基本定义、常考概念、算法以及进制转换等关键点。 一...
在学习Objective-C之前,深入理解C语言的知识点至关重要。C语言以其高效、简洁和灵活性被广泛应用于系统编程、嵌入式开发、游戏引擎等领域。本资料主要涵盖了C语言的核心概念,旨在帮助你巩固基础,为之后学习...
谭浩强 基础c语言知识,适合c语言的初级学者,最基本的c语言知识点
C语言基础学习知识点 C语言基础学习知识点 C语言的具体结构 主函数 程序解释——注释 C语言标识符 变量及赋值 基本数据类型 格式化输出语句
C语言是一种广泛应用于计算机编程的基础语言,尤其对计算机科学考研者和初学者而言,掌握C语言的基本知识至关重要。本文将对C语言的一些关键知识点进行详细总结。 首先,C语言的源程序由一个或多个函数构成,但必须...