2017-02-02 5 views
1

прокрутка http://git.suckless.org/st/plain/st.c я наткнулся наЭто обычная ошибка или умный прекомпилятор Trick?

#define LEN(a) (sizeof(a)/sizeof(a)[0]) 

Я знаю, что препроцессор магия трудно, и мой C Эйнта лучшего

, но это заставляет меня задаться вопросом, если круглые скобки в конце имеют смысл - не так ли что-то вроде

#define LEN(a) (sizeof(a)/sizeof((a)[0])) 
+0

https://news.ycombinator.com/item?id=13549823 – santa

ответ

2

оператору sizeof не очень нужна скобки, если операнд является левосторонней выражение вместо типа, так что ваша скобка на второй sizeof не нужны, так как этот не ожидает типа (из-за конечного [0]). Этот макрос LEN, по-видимому, используется для получения размера статически определенного вектора.

Например:

int v[10]; 

LEN(v) will expand to (sizeof(v)/sizeof(v)[0]) 

И (v)[0] такого же, как v[0] поэтому второй SizeOf на самом деле что-то вроде sizeof v[0] которое справедливо использование sizeof (не требует скобки)

Хорошо известно (по крайней мере, здесь, при переполнении стека) пример sizeof, который не требует скобок:

Чтобы получить динамически определенный 10-элементный вектор. Обратите внимание, что предыдущий макрос LEN здесь не работает.

+0

Спасибо, я понятия не имел, что можно использовать sizeof w/o parens, и я никогда не видел обозначение sizeof pointer как это. но все имеет смысл, когда я считаю sizeof как оператор, а не функцией – santa