Примечания для #if 199901L <= STDC_VERSION
и #if GNUC < 3
относятся к тому факту, что в тесте на значение неопределенного макроса макрос заменяется на ноль. Так что в этом случае GNUC < 3
будет истинно, даже если компилятор не GNUC. Он должен быть квалифицирован как #if defined GNUC && GNUC < 3
или заключен в более ранний тест для defined GNUC
или другого специфического макроса GNUC.
Если STDC_VERSION предполагается равным нулю, тогда проверка #if 199901L <= STDC_VERSION
всегда будет ложной. Стандартный макрос для этого теста на самом деле STDC_VERSION . Однако применяемый стандарт C не имеет значения, если используется компиляция C ++, поэтому может подойти предварительный тест для defined __cplusplus
.
Эти макросы обычно предопределены препроцессором и не требуют заголовка. Подробнее о предопределенных макросах, определяющих стандарты, компиляторы, архитектуры и ОС, см. http://predef.sourceforge.net/prestd.html
Ошибки компоновщика - это другая проблема, которая не может быть устранена # включением других файлов. Если вы пропустили заголовок, компиляция не удалась. Неразрешенные символы компоновщика неизменно из-за отсутствия кода. Возможно, вы не связали необходимую библиотеку или объектный файл, или код мог быть пропущен при более ранней условной компиляции (код в ложном блоке #if...#endif
).