2012-02-02 87 views
0

我的一位同事在ANSI C中与const有点相似,我想知道你们对它的想法。他写这样的东西,例如:
在一个变量声明中有多个常量

const uint8* const pt_data 

我明白,他与这是怎么回事,但对我来说它使阅读和可维护性很难与所有这些常量无处不在。

+3

对此有疑问?本网站不是为了表达您的意见,而是为了获得客观的问题答案。 – interjay 2012-02-02 09:04:46

+0

感谢您的输入...在 – Leo 2012-02-02 09:10:41

+0

下回答的问题您的同事是否在头文件和实现中都这样做? – 2012-02-02 09:28:55

回答

5

这是一个const指向const数据的指针。

  • 第一const防止*pt_data = 10;
  • 第二const防止pt_data = stuff;

看起来它可以是相当合理的。

+0

这样做也是很好的编程习惯。获得编译器来防止首先发生的任何错误要便宜很多。 – 2012-02-02 09:10:13

+0

@EdHeal好吧,它可以。但是,经过一定的门槛后,我发现所有的常量都会让你的生活更加艰难。但是,是的,这通常是有用的和自我记录。 – cnicutar 2012-02-02 09:11:20

+0

这就是我也觉得,我的意思是我理解的用处,但是那家伙把常量无所不在,所以它使代码难以阅读 – Leo 2012-02-02 09:13:11

5

它是一个常量指针,指向一个常量数据。
这意味着你不能改变数据(其地址为pt_data存储),也不能改变指针(pt_data)指向其他地址(其他地址)。

他可能需要这种方式。

4

const总是指其右边的字,除非它是在该行,它指的是项目本身的结束(在高级语言)

const char* str; //This is a pointer to read-only char data 
       //Read as to (const char)* str; 
       //Thus : 
       // *str = 'a'; 
       //Is forbidden 

char* const str; //This is a read-only pointer to a char data 
       //Read as char* (const str); 
       //Thus : 
       // str = &a; 
       //Is forbidden 

const char* const str; //This is a read-only pointer to read-only char data 
         //Read as (const char)* (const str); 
         //Thus : 
         // str = &a 
         // and 
         // *str = 'a'; 
         //Is forbidden 

你应该总是初始化这些指示它们时的指针(除非它们是参数)

const关键字非常适合确保某些内容不会被修改,并且还会告诉它不应该被修改的开发者。例如int strlen(const char* str)告诉你在你的字符串中的数据不会被修改。

1

如果从变量名开始,逆时针转动,pt_dataconst指向uint8的指针,它是const

请参见下面的原油ASCII图片:

 
    ,--------------------------------. 
    |        | 
    |  ,------------------------. | 
    |  |      | | 
    |  | ,------------------. | | 
    |  | |     | | | 
    |  | | ,-----------. | | | 
    |  | | |   | | | | 
const uint8 * const pt_data; | | | | 
     | | |  |  | | | | 
     | | |  `-----' | | | 
     | | |    | | | 
     | | `-------------' | | 
     | |     | | 
     | `--------------------' | 
     |       | 
     `--------------------------' 

自从我在一个旧的C的书很多年前看到这个方案,它帮助我理解复杂的声明。

+1

这是大卫·安德森[顺时针或螺旋规则(http://c-faq.com/decl/spiral.anderson.html)。 – 2012-02-02 11:05:38

+0

@Als看来我的方向错了,但至少现在我有地方点描述它时。谢谢! :) – 2012-02-02 11:17:06