如何在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”函数的指针。
由于
答案 0 :(得分:17)
将星号视为“障碍”。更接近变量名称的限定符(const
或volatile
)比星号修改指针本身。限定符比变量名更远,而不是星号修改指针将引用的内容。因此,在这种情况下,您将拥有:
static void * volatile f_pointer(void *);
当然,除了你需要parens来定义一个指向函数的指针而不是声明一个返回指针的函数之外:
static void (*volatile f_pointer)(void *);
static
是一个存储类而不是限定符,因此在它的情况下不为真。您只能为变量本身指定存储类,而不是它指向的存储类。没有“指向extern int”或“指向static int”的指针,只有“指向int的指针”。如果您指定了存储类(static
或extern
),则它始终是第一个。
其他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>
答案 2 :(得分:8)
static void (* volatile f_pointer)(void*);