关键字static、const、volatile、#if 0 、#ifdef、#ifndef等解释
2012-04-11 13:50
330 查看
以下内容收集整理于网络:
关键字static的作用是什么?
这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:
1、在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
(理解可能会产生歧义,个人补充下:有点类似全局变量,当调用后值被修改,下次重新调用的时候会维持上一次修改后的值)
2、 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3、在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
大多数应试者能正确回答第一部分,一部分能正确回答第二部分,但是很少的人能懂得第三部分。做为一个合格的软件工程师,我们要懂得第三部分的作用,要懂得本地化数据和代码范围的好处和重要性。
int testStatic()
{
int x=1;
x++;
return x;
}
main()
{
int i;
for(i=0;i<5;i++)
printf("%d/n",testStatic());
}
输出为:
2 2
2 2 2
int testStatic()
{
static int x=1;
x++;
return x;
}
main()
{
int i;
for(i=0;i<5;i++) //(维持上一次修改后的值)
printf("%d/n",testStatic());
}
输出为:
2 3
4 5 6
MFC中static成员变量不属于对象的一部分,而是类的一部分,程序在没有诞生任何对象时就处理该成药变量,所以static成员变量必须初始化。
static成员是类成员而非实例成员,类成员的含义是该成员变量属于这个类所有的实例,而不是某一特别实例。
const 有什么用途?
(1)可以定义const 常量
(2)const可以修饰函数的参数、返回值,甚至函数的定义体。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 const意味着"只读"。区别如下代码的功能非常重要。
前两个作用是一样的,a是一个常整型数。
第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。
第四个意思是a是一个指向整型数的常指针(也就是,指针指向的整型数是可以修改的,但指针是不可修改的)。
最后一个意味着a是一个指向常整型数的常指针(也就是,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
(1)关键字const的作用是为给读你代码的人传达非常有用的信息。例如,在函数的形参前添加const关键字意味着这个参数在函数体内不会被修改,属于"输入参数"。在有多个形参的时候,函数的调用者可以凭借参数前是否有const关键字,清晰的辨别哪些是输入参数,哪些是可能的输出参数。
(2)合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改,这样可以减少bug的出现。
const在C++语言中则包含了更丰富的含义,而在C语言中仅意味着:"只能读的普通变量",可以称其为"不能改变的变量"(这个说法似乎很拗口,但却最准确的表达了C语言中const的本质),在编译阶段需要的常数仍然只能以#define宏定义!故在C语言中如下程序是非法的:
以下是工作中的使用const例子:
const unsigned char * pbyData;
unsigned char const DayPerMonth[12] = { 31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31 } ;
extern void dp_write_dsp_block ( const word *bp, word len );
const unsigned short cnstUni2InterMapSparseIdx[];
volatile问题:
volatile的语法与const是一样的,但是volatile的意思是“在编译器认识的范围外,这个数据可以被改变”。不知何故,环境正在改变数据(可能通过多任务处理),所以,volatile告诉编译器不要擅自作出有关数据的任何假设——在优化起家这是特别重要的。如果编译器说:“我已经吧数据读入寄存器,而且在没有与寄存器接触。”在一般情况下,它不需要再读入这个数据。但是,如果数据是volatile修饰的,编译器则是不能做出这样的假定,因为数据可能被其他进程改变了,编译器必须重新读这个数据而不是优化这个代码。就像建立const对象一样,程序员也可以建立volatile对象,甚至还建立const
volatile对象。这个对象不能被程序员改变,但可通过外面的工具改变。
volatile对象每次被访问时必须重新读取这个变量的值,而不是用保存在寄存器中的备份。下面时volatile变量的几个例子:
.并行设备的硬件寄存器(如状态寄存器);
.一个中断服务子程序中会访问到的非自动变量(Non-automatic variables);
.多现成应用中被几个任务共享的变量。
一个参数可以const同时也是volatile,一个指针也是可以为volatile的,但是具体编程时要小心,要保证不被意外修改。
当注释掉大块代码时,使用"#if 0"比使用"/**/"要好,因为用"/**/"做大段的注释要防止被注释掉的代码中有嵌套的"/**/",这会导致注释掉的代码区域不是你想要的范围, 当被注释掉的代码很大时容易出现这种情况,特别是过一段时间后又修改该处代码时更是如此。
bool为布尔型,只有一个字节,取值false和true,是0和1的区别
关键字static的作用是什么?
这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:
1、在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
(理解可能会产生歧义,个人补充下:有点类似全局变量,当调用后值被修改,下次重新调用的时候会维持上一次修改后的值)
2、 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3、在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
大多数应试者能正确回答第一部分,一部分能正确回答第二部分,但是很少的人能懂得第三部分。做为一个合格的软件工程师,我们要懂得第三部分的作用,要懂得本地化数据和代码范围的好处和重要性。
int testStatic()
{
int x=1;
x++;
return x;
}
main()
{
int i;
for(i=0;i<5;i++)
printf("%d/n",testStatic());
}
输出为:
2 2
2 2 2
int testStatic()
{
static int x=1;
x++;
return x;
}
main()
{
int i;
for(i=0;i<5;i++) //(维持上一次修改后的值)
printf("%d/n",testStatic());
}
输出为:
2 3
4 5 6
MFC中static成员变量不属于对象的一部分,而是类的一部分,程序在没有诞生任何对象时就处理该成药变量,所以static成员变量必须初始化。
static成员是类成员而非实例成员,类成员的含义是该成员变量属于这个类所有的实例,而不是某一特别实例。
const 有什么用途?
(1)可以定义const 常量
(2)const可以修饰函数的参数、返回值,甚至函数的定义体。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 const意味着"只读"。区别如下代码的功能非常重要。
const int a; int const a; const int *a; int * const a; int const * a const; |
第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。
第四个意思是a是一个指向整型数的常指针(也就是,指针指向的整型数是可以修改的,但指针是不可修改的)。
最后一个意味着a是一个指向常整型数的常指针(也就是,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
(1)关键字const的作用是为给读你代码的人传达非常有用的信息。例如,在函数的形参前添加const关键字意味着这个参数在函数体内不会被修改,属于"输入参数"。在有多个形参的时候,函数的调用者可以凭借参数前是否有const关键字,清晰的辨别哪些是输入参数,哪些是可能的输出参数。
(2)合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改,这样可以减少bug的出现。
const在C++语言中则包含了更丰富的含义,而在C语言中仅意味着:"只能读的普通变量",可以称其为"不能改变的变量"(这个说法似乎很拗口,但却最准确的表达了C语言中const的本质),在编译阶段需要的常数仍然只能以#define宏定义!故在C语言中如下程序是非法的:
const int SIZE = 10; char a[SIZE]; /* 非法:编译阶段不能用到变量 */ |
const unsigned char * pbyData;
unsigned char const DayPerMonth[12] = { 31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31 } ;
extern void dp_write_dsp_block ( const word *bp, word len );
const unsigned short cnstUni2InterMapSparseIdx[];
volatile问题:
volatile的语法与const是一样的,但是volatile的意思是“在编译器认识的范围外,这个数据可以被改变”。不知何故,环境正在改变数据(可能通过多任务处理),所以,volatile告诉编译器不要擅自作出有关数据的任何假设——在优化起家这是特别重要的。如果编译器说:“我已经吧数据读入寄存器,而且在没有与寄存器接触。”在一般情况下,它不需要再读入这个数据。但是,如果数据是volatile修饰的,编译器则是不能做出这样的假定,因为数据可能被其他进程改变了,编译器必须重新读这个数据而不是优化这个代码。就像建立const对象一样,程序员也可以建立volatile对象,甚至还建立const
volatile对象。这个对象不能被程序员改变,但可通过外面的工具改变。
volatile对象每次被访问时必须重新读取这个变量的值,而不是用保存在寄存器中的备份。下面时volatile变量的几个例子:
.并行设备的硬件寄存器(如状态寄存器);
.一个中断服务子程序中会访问到的非自动变量(Non-automatic variables);
.多现成应用中被几个任务共享的变量。
一个参数可以const同时也是volatile,一个指针也是可以为volatile的,但是具体编程时要小心,要保证不被意外修改。
当注释掉大块代码时,使用"#if 0"比使用"/**/"要好,因为用"/**/"做大段的注释要防止被注释掉的代码中有嵌套的"/**/",这会导致注释掉的代码区域不是你想要的范围, 当被注释掉的代码很大时容易出现这种情况,特别是过一段时间后又修改该处代码时更是如此。
在这里顺便对条件编译(#ifdef, #else, #endif, #if等)进行说明。以下分3种情况: 1. 情况1: #ifdef _XXXX ...程序段1... #else ...程序段2... #endif 这表明如果标识符_XXXX已被#define命令定义过则对程序段1进行编译;否则对程序段2进行编译。 例: #define NUM ............. ............. ............. #ifdef NUM printf("之前NUM有过定义啦!:) \n"); #else printf("之前NUM没有过定义!:( \n"); #endif } 如果程序开头有#define NUM这行,即NUM有定义,碰到下面#ifdef NUM的时候,当然执行第一个printf。否则第二个printf将被执行。 我认为,用这种,可以很方便的开启/关闭整个程序的某项特定功能。 2:情况2: #ifndef _XXXX ...程序段1... #else ...程序段2... #endif 这里使用了#ifndef,表示的是if not def。当然是和#ifdef相反的状况(如果没有定义了标识符_XXXX,那么执行程序段1,否则执行程序段2)。例子就不举了。 3:情况3: #if 常量 ...程序段1... #else ...程序段2... #endif 这里表示,如果常量为真(非0,随便什么数字,只要不是0), 就执行程序段1,否则执行程序段2。 如果有#if需要顶格写
bool为布尔型,只有一个字节,取值false和true,是0和1的区别
相关文章推荐
- 解释一下C语言中的关键字const、volatile、static
- C++ 关键字 static register const volatile extern
- Static、Extern、Volatile及Const关键字总结
- 关键字static、Const、Volatile的作用是什么
- 关键字static、const、volatile的作用
- 区分const,static,readonly,volatile四个关键字
- 说明以下关键字的作用 auto static register const volatile extern
- C语言中关键字auto、static、register、const、volatile、extern的作用
- 关键字extern、volatile、const、static
- 几个关键字static & const & volatile
- 说明以下关键字的作用 auto static register const volatile extern
- const,define,static,$GLOBALS,final关键字解释
- 关键字:auto、static、register、const、volatile 、extern 总结
- c中常用的关键字static const volatile
- 关键字auto、static、register、const、volatile 、extern
- 关键字static、const、volatile的作用
- Static、Extern、Volatile及Const关键字总结
- 嵌入式经典面试题---C中有关预处理,关键字const、volatile、static,位操作,等等
- 关键字static,const,volatile,auto,register
- 【C语言 C++】简单关键字Register,Const,Static,Volatile,typedef,Define的理解