Это вопрос с мелкими деталями, состоящий из трех частей. Контекст что я хочу убедить некоторых людей в том, что безоговорочно использовать определение 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, пожалуйста, ответьте, только если вы можете назвать конкретную реализацию и указать дату ее выпуска. Ответы, в которых указываются общие характеристики реализаций, которые могут быть квалифицированы, мне не нужны.