2016-04-04 7 views
5

Afaik uintptr_t и intptr_t могут быть использованы для хранения любых указаний к void. Следовательно, эти типы могут использоваться для хранения указателей до данных.Эквивалент uintptr_t/intptr_t для указателей на функции?

В C99 или более поздних версиях существуют одинаковые и целочисленные целые числа без знака, способные удерживать указатели на функции?

+0

Существует не один тип «указатель на функцию» (каждый тип зависит от прототипа функции). –

+0

Нет, их нет. –

+0

Вы даже не можете преобразовать указатель на функцию 'void *'. Также C и C++ - разные языки. Пожалуйста, ограничьте свой вопрос одним из них. – Olaf

ответ

7

Нет, таких типов нет.

Указатели функций могут быть надежно отнесены только к другим типам указателей функций (а затем, только разыменовываются, указывая на правильный тип функции).

Преобразование указателей на функции в целые числа в C покрыта 6.3.2.3/6:

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

Обратите внимание, что даже если целочисленный тип достаточно велик, отбрасывание целых чисел и обратно на указатель функции не гарантируется для получения исходного указателя функции.

В C++ текст находится в [expr.reinterpret.cast] пунктах 4 и 6. Поведение аналогично, но оно явно гарантирует, что если существует целое число достаточного размера, то преобразование указателя функции в целое и обратно извлекает исходный указатель функции.

+1

Просто добавьте, что реализация должна указывать поведение _implementation defined_. Поэтому нужно иметь возможность определить, действительно ли и как такое преобразование действительно для конкретной реализации. Это может быть сделано ABI, не обязательно в компиляторе. Аналогичное преобразование может быть возможным между 'void *' и указателем функции (см. J.5.7). – Olaf

+0

Просто для информирования других читателей: J.5 в стандарте C - это раздел об общих расширениях языка C в * информативном * (не нормативном) приложении J о проблемах переносимости. – jotik

+0

Вы можете сделать преобразование надежным: '_Static_assert (sizeof (uintptr_t)> = sizeof (func_pointer_t)," bleh ");'. Тогда такие преобразования будут терпеть неудачу только на неясных системах, где указатели - это нечто иное, чем адреса (IMO такие системы заслуживают катастрофы). – Lundin

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

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