C:声明指向函数的易失性指针

时间:2011-02-02 17:41:51

标签: c volatile

如何在C中声明一个指向函数的指针,以使指针本身是易失性的。

static void volatile (* f_pointer)(void*);

static void (volatile * f_pointer)(void*);

static void (* volatile f_pointer)(void*);

为什么我问这个?我在http://wiki.answers.com/Q/Volatile_example_code_sample_coding_of_volatile_pointer读到了关于volatile指针的内容。

有时会出现易失性指针和指向易失性指针的问题:

  

现在,事实证明指针指向   易变量很常见。   这两个声明都声明了foo   是一个指向易失整数的指针:

volatile int * foo; 
int volatile * foo; 
  

非易失性变量的易失性指针非常罕见(我想我已经使用过一次),   但我最好继续给你语法:

int * volatile foo;

所以,我希望获得一个易失性指针,而不是指向“volatile”函数的指针。

由于

3 个答案:

答案 0 :(得分:17)

将星号视为“障碍”。更接近变量名称的限定符(constvolatile)比星号修改指针本身。限定符比变量名更远,而不是星号修改指针将引用的内容。因此,在这种情况下,您将拥有:

static void * volatile f_pointer(void *);

当然,除了你需要parens来定义一个指向函数的指针而不是声明一个返回指针的函数之外:

static void (*volatile f_pointer)(void *);

static是一个存储类而不是限定符,因此在它的情况下为真。您只能为变量本身指定存储类,而不是它指向的存储类。没有“指向extern int”或“指向static int”的指针,只有“指向int的指针”。如果您指定了存储类(staticextern),则它始终是第一个

其他threads已经讨论了线程与volatile之间的关系,所以我不会在此重复,除非注意到这个可能没用。

答案 1 :(得分:10)

cdecl对于这类问题非常方便:

$ cdecl
Type `help' or `?' for help
cdecl> declare f_pointer as static volatile pointer to function(pointer to void) returning void
static void (* volatile f_pointer)(void *)
cdecl>

cdecl的来源:http://cdecl.org/files/cdecl-blocks-2.5.tar.gz

答案 2 :(得分:8)

static void (* volatile f_pointer)(void*);