2015-04-17 8 views
0

Имеет ли следующий код c11? Я проверил стандарт, и он кажется неподдерживаемым, но я могу что-то упустить. Этот пример немного надуман, но моя фактическая ситуация включает в себя тысячу строк кода и не имеет большого смысла без всего этого контекста, и этот пример правильно изолирует принципала, о котором я хочу спросить. Дело в том, что я использую собственный адрес функции, используя свой идентификатор.Может ли функция использовать свой собственный адрес в c11?

typedef void(*ftype)(void*,void*); 

void func(void* v, void* w) 
{ 
    if(func != (ftype)v) ((ftype)v)(((void**)w)[0], ((void**)w)[1])); 
} 

Таким образом, идея заключается в том, чтобы запустить функцию, на которую указывает V-за его побочных эффектов, с его входной задается массив, на который указывает ш. Однако желательно не запускать v, если это будет ссылка на функцию func.

EDIT: Комментарий ответил на вопрос: «Прямой вызов функции подразумевает неявное преобразование (« распад ») из имени функции в указатель на функцию.

+1

Возможный дубликат [C cast void pointer to function pointer] (http://stackoverflow.com/questions/13696918/c-cast-void-pointer-to-function-pointer) – Axalo

+0

Как это дубликат этого вопрос? Я действительно не вижу никакой связи. – jack

+2

Не могли бы вы заменить тело функции 'ftype f = func;' и получить тот же вопрос? – immibis

ответ

1
typedef void(*ftype)(void*,void*); 
void func(void* v, void* w); 

ftype myfunc = func; //here 

Поскольку мы можем взять адрес функции, которые являются 100% не определено в каждом ЕП, нет никаких оснований, что C должны иметь правила, Запрещает принимая адрес функции, которая частично определена. И когда мы проверяем, такого исключения нет. Поэтому вы всегда можете взять адрес объявленной функции, даже внутри функции.