2012-03-04 2 views
4

У меня есть следующий код:Выделите длинный указатель на функцию?

long fp = ... 
void (*ptr)(long, char*, char*) = fp; 

fp Долгие является правильным указателем на функцию, которая приходит как долго. Я получаю стандартное предупреждение «make pointer from int without cast». Я хочу иметь возможность компилировать с:

-std=iso9899:1990 -pedantic-errors 

, который превращает это предупреждение в сообщение об ошибке. Вопрос в том, что такое правильный перевод? Я пробовал различные догадки, например:

void (*ptr)(long, char*, char*) = (void)(*)(long, char*, char*) fp; 

Но, похоже, не может найти правильный вариант.

+0

Зачем вам это нужно? –

+0

Зачем мне это делать? – gubby

+0

Листинг между целыми числами и указателями функций? –

ответ

7

«Правильный» бросок:

void (*ptr)(long, char*, char*) = (void (*)(long, char*, char*))fp; 

Очевидно, что это может быть убрано с подходящим ЬурейиМ.

Но в любом случае результат этого определяется реализацией. Если можно, избегайте этого и сохраняйте указатель в типе указателя. Лучше всего было бы использовать intptr_t, если он доступен.

+0

@KerrekSB: В каком смысле? –

+0

Нет, неважно, все в порядке! –

7

Возможно, это что-то вроде:

void (* ptr)(long, char, char *) = (void (*)(long, char, char *))fp; 

, но мое предложение использовать typedef и забыть обо всем этом беспорядке:

typedef void (* fnPtr)(long, char, char*); 
fnPtr ptr = (fnPtr) fp; 
+0

Да, использование typedef - это правильный путь – slashmais

4

Единственный «правильный» путь, чтобы не бросить на все , но скорее скопируйте двоичное представление:

long fp; 
void (*ptr)(long, char*, char*); 

memcpy(&ptr, &fp, sizeof ptr); 
+0

За исключением катастрофического сбоя, когда sizeof (long)! = Sizeof (ptr). –

2

Основная проблема заключается в том, что ANSI-C не позволяет этого, несмотря на бесчисленные C-API, опираясь на эту функцию. Поэтому при компиляции с -pedantic вы столкнетесь с проблемой. Как было намечено другими плакатами, вы можете обманывать бросок, используя такие вещи, как memcpy() или тип объединения для кастинга.

Кстати, POSIX гарантирует, что это сработает, поэтому часть о «результатах, определяемых реализацией» становится намного менее страшной.

+0

Спасибо за подсказку. – gubby

+0

C99 явно разрешает это, он просто утверждает, что результаты определены реализацией. –

+0

Прохладный, я этого не знал. Я в основном парень на С ++, поэтому я больше знаком с C89, который афайк этого не допустил. – ComicSansMS

 Смежные вопросы

  • Нет связанных вопросов^_^