Переносимость использования offsetof из stddef.h вместо прокрутки собственного

Это вопрос с мелкими деталями, состоящий из трех частей. Контекст что я хочу убедить некоторых людей в том, что безоговорочно использовать определение offsetof , данное в , вместо того, чтобы (при некоторых обстоятельствах) кататься самостоятельно. вопрос написан полностью на простом старом C, поэтому, пожалуйста, полностью игнорируйте C ++ при ответе.

Часть 1: При использовании так же, как стандартное offsetof , расширяется ли этот макрос вызывает неопределенное поведение в соответствии с C89, почему или почему нет, и отличается ли он в C99?

#define offset_of(tp, member) (((char*) &((tp*)0)->member) - (char*)0)

Примечание: все реализации, представляющие интерес для людей, чья программа это заменяет стандартное правило, согласно которому указатели могут вычитаться друг из друга только тогда, когда они указывают на один и тот же массив, определяя все указатели, независимо от типа или значения, на po int в единое глобальное адресное пространство. Поэтому, пожалуйста, не полагайтесь на это правило, утверждая, что расширение этого макроса вызывает неопределенное поведение.

Часть 2: Насколько вам известно, была ли когда-либо выпущена производственная реализация C, которая, при подаче расширения вышеуказанного макроса (при некоторых обстоятельствах) вел бы себя иначе, чем если бы вместо него был использован макрос offsetof ?

Часть 3: Насколько вам известно, что является последней выпущенной производственной реализацией C, которая либо не предоставляла stddef.h , либо не предоставляла рабочее определение offsetof в этом заголовке? Заявлено ли в этой реализации о соответствии какой-либо версии стандарта C?

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

12
задан zwol 14 July 2011 в 22:52
поделиться