Я видел #ifndef ABC и #if !defined (ABC) в том же исходном файле C.
Есть ли между ними тонкая разница?
(Если это вопрос стиля, зачем кому-то использовать их в одном файле)
Ответ 1
Нет, нет никакой разницы между ними при использовании таким образом. Последняя форма (с использованием defined()) полезна, когда исходный #if или один из следующих #elif условий требует более сложного теста. #ifdef все равно будет работать, но в этом случае может быть более понятным использование #if defined(). Например, если необходимо проверить, определено ли более одного макроса, или если оно равно определенному значению.
Дисперсия (с использованием обоих в файле) может зависеть от конкретных тонкостей в использовании, как упомянуто выше, или просто плохой практики, будучи несогласованными.
Ответ 2
В контексте, который вы указали, они одинаковы: вы просто проверяете наличие одного идентификатора макроса.
Однако форма #if позволяет вам оценивать выражения, которые могут быть полезны.