2015-01-11 1 views
0

Основной вопрос: есть ли переносная (или, по крайней мере, библиотека, которая находится в большинстве компиляторов) способ запроса типа указателя void * во время выполнения? В частности, можно ли определить, имеет ли указатель тип struct x или тип struct y (в качестве примера).Есть ли способ переносить тип указателя void *?

Дополнительная информация: Я знаю, что gcc предлагает оператор typeof, но я хочу более портативный, менее компиляторный способ выполнения одной и той же вещи.

Требования:

  1. не должна быть полностью зависит от компилятора. Сюда относятся макросы, специфичные для компилятора, и другие функции, обычно не используемые в большинстве компиляторов.

  2. Я бы предпочел функцию, которая работает на любом компиляторе по сравнению с любой менее переносимой реализацией (хотя я буду принимать ответ, который наилучшим образом соответствует моим целям).

  3. Вполне возможно предложить использовать функцию в библиотеке, которая не находится в функции C11, но обычно встречается в большинстве компиляторов. Убедитесь, что вы объясните, как это работает, и аргументы.

+1

'typeof' задает статический тип (т. Е. Объявленный тип); если вы примените его к выражению 'void *', то тип 'void *', а не то, что он изначально был (если что-то, кроме 'void *'). – mafso

+0

Хммм ... ну, в любом случае это будет бесполезно; почему они включают, что, если он не может сказать вам одно, что вам нужно знать? –

+0

'#define SWAP (x, y) do {typeof (x) _tmp = (x); (x) = (y); (y) = _tmp; } while (0) ', например. В C нет информации о типе времени выполнения, если вам нужна эта информация, вы должны явно хранить ее где-то. – mafso

ответ

6

То, о чем вы просите, невозможно. A void * указатель по определению общий указатель. Его можно отличить от указателя любого типа; нет способа определить, какой тип данных (если есть!) указывает на это.

+0

Было бы проблемой, если я попытаюсь получить доступ к полю, которое не существует или не используется для неправильного типа? –

+1

@ Исаия Определенно. – pmr

+0

Тогда, по определению, единственным переносимым, не подверженным ошибкам способом для этого было бы иметь функцию принять другой аргумент, определяющий тип указателя void *? –