2013-04-28 65 views
0
typedef int* ptr_t; 
int target; 
const ptr_t a = ⌖ 
*a = 6;   //OK 
a = &target;  //<- error: assignment of read-only variable ‘a’ 

显然,指针是常量,而不是指向的值。相反,如果使用#define。typedef-ed指针如何工作

对typedef中声明的指针应用修饰符的规则是什么?

对于一个实际的例子,考虑代码 void (**foo)(void);

  • 一个如何去的typedef-ING一个类型,有资格顶级指针为const(例如,指向一个硬件的位置),下一个指针是挥发性的(例如,可以由独立硬件修改)指向函数的指针?

  • typedef void (**foo)(void)如果这是我们必须处理的固定声明,那么请在源代码中执行上述操作?

回答

3

C标准的第6.7.5.1节描述了区别。它给作为一个例子:

const int *ptr_to_constant; 
int *const constant_ptr; 

,并说:

任何对象的内容,将ptr_to_constant不得 通过该指针修改,但ptr_to_constant本身可以 更改为指向另一个对象。同样,constant_ptr指向的int 的内容可能会被修改,但constant_ptr本身 应始终指向相同的位置。

最后,该部分的第4点描述了使用typedefs。

恒定指针constant_ptr的声明可通过包括用于类型“‘指针为int’”的定义加以澄清 。

typedef int *int_ptr; 
    const int_ptr constant_ptr; 

声明constant_ptr作为具有键入“‘const限定 指针为int’”中的对象。

3

的规则是:

  • typedef是不是纯文本替换像宏。
  • 声明不会被解析,看看有参与的typedef
  • CV预选赛适用于你用typedef即创建的同义词指针:int *

所以,

typedef int* ptr_t; 
const ptr_t a = &target; 

不一样:

const int* a; 

却是一样的:

int *const a; 

以文字记述,首先声明一个const常量指针为int,而不是像第二个那样指向常量int。

正如您刚刚从你的例子注意到,
这是一个不好的做法,typedef指针,因为它降低了代码的可读性和直观性。它很容易在使用typedef指针时创建错误。最好避免它。