Мне интересно, требует ли простой макрос offset_of_ разыменования указателя not. Например, структура C++ (означает, что этот код будет скомпилирован с использованием компилятора C++), которая объявлена с атрибутом pack
struct A {
int x;
int y;
} __attribute__(packed);
Предположим, что в данном случае sizeof(int) == 4, чтобы вычислить смещение y внутри A, я написал простой макрос:
#define offset_of_y (ptrdiff_t)(&(((A*)0)->y))
Можем ли мы быть уверены, что значение этого макроса всегда равно 4? Есть ли разыменование указателя от 0 (который может быть UB) при вызове макроса?
Большое спасибо за любой ответ.





Доступ к чему-либо через нулевой указатель - это UB, точка.
(Unless the context is unevaluated, but in this case it IS evaluated.)
Вероятно, вам нужен offsetof().
На практике ваш код, вероятно, работает мог, но формально он не определен.
Комментарии не подлежат расширенному обсуждению; этот разговор был переехал в чат.
Комментарии не подлежат расширенному обсуждению; этот разговор был переехал в чат.