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 указатель на функцию, а не указатель на функцию "volatile".

Спасибо

Ответ 1

Вспомните звездочку как "барьер". Квалификаторы (const или volatile) ближе к имени переменной, чем звездочка, изменяют сам указатель. Отклонения от имени переменной, чем звездочка, изменяют то, на что будет ссылаться указатель. Поэтому в этом случае у вас будет:

static void * volatile f_pointer(void *);

За исключением, конечно, что вам нужны парсеры для определения указателя на функцию вместо объявления функции, возвращающей указатель:

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

static - это класс хранения, а не классификатор, поэтому в его случае это не так. Вы можете указать только класс хранения для самой переменной, а не то, на что она указывает. Нет такой вещи, как "указатель на extern int" или "указатель на статический int", только "указатель на int". Если вы укажете класс хранения (static или extern), он всегда будет первым.

Другие темы обсудили взаимосвязь между потоками и volatile, поэтому я не буду повторять, что здесь не следует отметить, что это, вероятно, не будет полезно.

Ответ 2

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

Ответ 3

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