2013-09-14 2 views
0

У меня есть кусок кода, чтобы выбросить ошибку во время компиляции с помощью директивы #error, проверяя наличие типа чипа на плате. Когда я бегу, я получаю вывод, что это что-то вроде ниже:Вывод директивы #error в C

errorchk.c:9:2: error: #error "I can't run" 

Я ожидал увидеть ошибку вроде этого:

errorchk.c:9: error: "I can't run" 

Я не в состоянии выяснить, что является ошибка в строке 9 (если есть), которая показана ниже.

#include "stdio.h" 
#define X 2 
void main() 
{ 
    int x=6; 
    if(x>5) 
    { 
#if X>1 
#error "I can't run" 
#endif 
    } 
} 

Не могли бы вы прояснить, является ли сообщение на стандартном выводе ожидаемым? по существу, является «#error» предполагается напечатать в строке ошибки?

ответ

2

Это ожидаемый результат (до stderr, а не stdout).

+0

Я предполагаю, что использовал неправильный термин. Я должен был быть немного более сложным. Я запускаю сборку для своего проекта, где он проверяет наличие периферийного чипа. Ожидается, что сборка будет прервана при определенных условиях и ошибка, отображаемая на терминале, где была запущена сборка. – abhi

4

В стандарте C не указывается точно, что должен выводить компилятор, только то, что токены после #error должны быть включены в выход. Выход, который вы получаете, «соответствует». Различные компиляторы могут делать разные вещи.

Например, clang имеет другой формат, но в соответствии тоже:

$ cat t.c 
#error hello 
$ clang -c t.c 
t.c:1:2: error: hello 
#error hello 
^ 
1 error generated. 

ошибка печатается, как вы хотите, с дополнительным контекстом.

Ссылка: C11 проект, §6.10.5 директива об ошибке

предварительной обработки директивы формы

# error pp-tokensopt new-line 

приводит к реализации для получения диагностического сообщения, которое содержит указанную последовательность токенов предварительной обработки.

1

Я бы предположил, что это полезная часть диагностики, чтобы знать, что это сообщение, переданное директивой #error, а не встроенное сообщение компилятора. В любом случае фактический формат диагностики компилятора любого типа не предусмотрен стандартом языка.

0

«Я не могу понять, что это ошибка в строке 9»

Макросы, которые используют директивы, начинающиеся с # запускаются перед остальной код компилируется, не говоря уже выполнена.

Ошибка ясно. X определяется как 2, когда препроцессор достигает строки 9, поэтому условие истинно, а директива #error срабатывает, останавливая компиляцию.

Может показаться некоторым, что значение x равно 6 в этой точке. Но код C не выполняется. Это еще не составлено. X и x не имеют ничего общего друг с другом.

Более интересный пример будет использовать один и тот же случай, X или x, в обоих местах.

#include "stdio.h" 
#define X 2 
void main() 
{ 
    int X=6; 
    if(X>5) 
{ 
#if X>1 
#error "I can't run" 
#endif 
    } 
} 

В этом случае они все еще не то же самое. Вместо этого препроцессор заменит каждое вхождение символа X в источнике символом 2. Даже если вы удалили директиву об ошибке, код не будет компилироваться, потому что строка int 2=6; недействительна C.

Смежные вопросы