Это вопрос с детальными деталями с тремя частями. Контекст заключается в том, что я хочу убедить некоторых людей в том, что безопасно использовать <stddef.h>
определение offsetof
безоговорочно, а не (при некоторых обстоятельствах) сворачивать свои собственные. Программа, о которой идет речь, написана целиком на простом старом C, поэтому игнорировать С++ полностью при ответе.
Часть 1: При использовании в том же порядке, что и стандартный offsetof
, расширяет ли этот макрос провоцирует поведение undefined на C89, почему или почему нет, и отличается ли он на C99?
#define offset_of(tp, member) (((char*) &((tp*)0)->member) - (char*)0)
Примечание. Все реализации, представляющие интерес для людей, чья программа это заменяет стандартное правило, что указатели могут быть вычтены друг от друга только тогда, когда они указывают на один и тот же массив, определяя все указатели, независимо от типа или значения, в одно глобальное адресное пространство. Поэтому не полагаться на это правило, если утверждать, что это расширение макроса вызывает поведение undefined.
Часть 2: Насколько вам известно, когда-либо была выпущена реализация C производства, которая при подаче расширения вышеупомянутого макроса будет (при некоторых обстоятельствах) вести себя по-другому, чем если бы ее offsetof
вместо этого использовался макрос?
Часть 3: Насколько вам известно, какова последняя выпущенная реализация C, которая либо не предоставляла stddef.h
, либо не предоставляла рабочее определение offsetof
в этом заголовке? Соответствует ли эта реализация требованиям любой версии стандарта C?
Для частей 2 и 3 ответьте только в том случае, если вы можете назвать конкретную реализацию и указать дату ее выпуска. Ответы, которые описывают общие характеристики реализаций, которые могут быть квалифицированы, мне не полезны.