Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1634832
  • 博文数量: 197
  • 博客积分: 10046
  • 博客等级: 上将
  • 技术积分: 1983
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-07 12:36
个人简介

在外企做服务器开发, 目前是项目经理, 管理两个server开发的项目。不做嵌入式好久了。

文章分类
文章存档

2011年(2)

2010年(6)

2009年(18)

2008年(30)

2007年(100)

2006年(41)

分类: LINUX

2006-08-09 19:46:23

 
| | | | | | |


   >>
此话题阅读次数: 366

  加到“个人收藏夹”   |   打印

(stranger)
06-08-04 21:45
[精华] c语言面试经常提问到的几个修饰符

static:修饰符:修饰变量,函数。作用域:变量仅仅在本文件可见,函数在本文件可以被调用。static在函数内部定义的话,分配在堆中,数值保存在data段,而不是在栈中,而且只赋值一次。
extern:修饰符:修饰变量,函数。修饰变量时候,变量的声明在外面,修饰函数的时候,如果函数已经声明,则作用不是很大。
const:修饰符:修饰变量,函数。修饰变量时候,不能被重复赋值,只能放在只读段中。修饰函数时候,表明函数的返回值必须为常数。
volatile:(嵌入式程序员必须掌握的)volatile最初的意思是表示汽油容易挥发,在c中的作用大概有两点(1)表示变量是易失的,易变的。(2)强制访存操作,防止编译器去优化,告诉编译器每次必须去内存中取值,而不是从寄存器或者缓存。

上面是我对几个变量修饰符的简单理解,肯定不全面,也会有错误,请达人或者高手赐教。
谢谢啦。

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(stranger)
06-08-04 22:29
[精华] Re: c语言面试经常提问到的几个修饰符 新 []

有位大哥说对const的解释不全,所以增加以后一些内容。
const int nValue; //nValue是const
const char *pContent; //*pContent是const, pContent可变
const (char *) pContent;//pContent是const,*pContent可变
char* const pContent; //pContent是const,*pContent可变
const char* const pContent; //pContent和*pContent都是const
int const nValue; // nValue是const
char const * pContent;// *pContent是const, pContent可变
(char *) const pContent;//pContent是const,*pContent可变
char* const pContent;// pContent是const,*pContent可变
char const* const pContent;// pContent和*pContent都是const
欢迎大侠指正。

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(newbie)
06-08-06 11:05
[精华] Re: c语言面试经常提问到的几个修饰符 新 []

static和extern是specifier即限定符
const和volatile是qualifier即修饰符,他们在grammar上是有区别的


“const (char *) p”根本不符合C语法


static和extern要从作用域,生存周期和linkage三个方面来考虑
const的语义是只读,即不要通过某左值修改其内容,但是可能通过其它左值修改,放在只读段只是某种实现方式

volatile提示编译器,由于异步操作,不要caching。。。


根据C的grammar
declaration-specifiers:
storage-class-specifier declaration-specifiersopt
type-specifier declaration-specifiersopt
type-qualifier declaration-specifiersopt
function-specifier declaration-specifiersopt
对于x的声明int const static x;type-specifier int,type-qualifier const和storage-class-specifier static的顺序语法上是任意的。语义上是相同的。


根据C的grammar
declarator:
pointeropt direct-declarator
pointer:
* type-qualifier-listopt
* type-qualifier-listopt pointer

可见int const * x与int * const x的不同:第一个const被归约为declaration-specifier,而第二个被归约为type-qualifier-list.....


“const (char *) p”根本不符合C语法

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(stranger)
06-08-06 21:30
[精华] Re: c语言面试经常提问到的几个修饰符 新 []

遇到传说中的高手了

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(stranger)
06-08-08 17:16
[精华] Re: c语言面试经常提问到的几个修饰符 新 []

的确很有高手风范。:P


--------------------
吃自助的最高境界: 扶墙进,扶墙出.

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(stranger)
06-08-08 21:19
[精华] Re: c语言面试经常提问到的几个修饰符 新 []

既然是精华帖了,就多写点。
思考:一个参数可以是const又可以是volatile吗?
我觉得应该是可以的,比如:只读的cpsr,定义它是volatile因为它可能被意想不到地改变,编译器不要省事去caching它,定义它是const是要求程序不应该试图去修改它。

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(newbie)
06-08-08 23:14
[精华] Re: c语言面试经常提问到的几个修饰符 新 []

呵呵,本人也是菜菜.....

C标准允许三种修饰符const volatile和restrict的任意组合

C99甚至允许一种修饰符多次出现,不过这在C89里面是个错误

所以说
int x;
int const x;
int const volatile x;
...一共8种都是合法的。

在C99还有第n种,不过和上面8种之一有相同的语义

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(journeyman)
06-08-08 23:30
[精华] Re: c语言面试经常提问到的几个修饰符 新 []

const 与 volatile 共用在语法上是可以的,但在实际使用中是没有必要的。

const告诉编译器将该对象是只读的,可以将其放在只读内存段中进行优化。
volatile告诉编译器访问该对象时必须从内存中取值,不要使用寄存器中的cache。是一种阻止优化的机制。

如果一个对象具有了const的属性肯定就不需要有volatile的属性。


--------------------
我本楚狂人,凤歌笑孔丘

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(newbie)
06-08-09 00:32
[精华] Re: c语言面试经常提问到的几个修饰符 新 []

语义上是有意义的!

“const告诉编译器将该对象是只读的,可以将其放在只读内存段中进行优化。”这个有待商榷。


const的语义是某个左值是只读的,但并不能防止通过程序内部或外部的方法修改它,另外被const修饰的左值不一定属于只读段,下面一个例子:

e.g.

{//inner block

char c;

char const * p;

p=&c;

*p;

}

这里表达式(*p)求得的左值被const qualifier修饰,而该左值属于栈空间


再说一种情况吧:
与storage-class-specifier不同,type-qualifier可以修饰struct域内变量
struct tag
{
const int a;
int b;
}sa;
如果具有const修饰符的左值都要放在只读区的话,那sa放在哪里?

其实最简单的例子是:f(const int p){}......

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(addict)
06-08-09 17:40
[精华] Re: c语言面试经常提问到的几个修饰符 新 []

>只读的cpsr

cpsr是个啥?


--------------------
我是马甲

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(newbie)
06-08-09 18:37
[精华] Re: c语言面试经常提问到的几个修饰符 新 []

cpsr ,spsr 程序状态寄存器
比如:ARM7TDMI-S内核包含1个CPSR和5个SPSR供异常处理程序使用。等等
是不是我说错了?错的话,请指出来!

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(journeyman)
06-08-09 19:22
[精华] Re: c语言面试经常提问到的几个修饰符 新 []

被const修饰的对象当然不一定放在只读段,这完全依赖于编译器的实现。

你举的几个例子很有意思,分析一下:

第一个例子:
{
char c;

char const * p;

p=&c;

*p ;
}

p 是一个指向 const char 的指针。在这里面没有任何对象被申明成 const,
所以编译器不会将任何对象放在只读段中。

第二个例子:
struct tag
{
const int a ;
int b ;
} sa ;

为什么a不能放在只读区呢?这完全依赖于编译器的实现。

第三个例子
f( const int p) {}

这说明了const的另外一个作用。在语法检查的时候可以阻止不必要的内存访问。而不需要在运行期时再做检查



--------------------
我本楚狂人,凤歌笑孔丘

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主

  加到“个人收藏夹”   |   打印

前往讨论区

阅读(961) | 评论(0) | 转发(0) |
0

上一篇:堆和栈的区别

下一篇:linux 引导内幕

给主人留下些什么吧!~~