2015-05-20 3 views
1
#include<stdio.h> 
#define NUM 10 
main() 
{  
    #ifdef NUM 
    printf("compilation succesfull"); 
    #endif 
} 

Приведенный выше код компилирует прекрасно и после выполнения оттисков сборник успешных, но если удалить пустую строку перед первым оператором в main() он дает ошибку. то есть. «бродячие #» в программе и многие другие ошибки.Условный ошибка компиляции с помощью макросов

#include<stdio.h> 
#define NUM 10 
main() 
{ #ifdef NUM        
    printf("compilation succesfull"); 
    #endif 
} 

Может ли кто-нибудь мне помочь?

+0

Разбор вопрос, ИМХО. Слышал о некотором правиле, что '#' должен быть первым символом строки. Не очень уверен. –

+1

Вы не «удалили пустую строку». – unwind

+1

@NatashaDutta первый символ пробела – thumbmunkeys

ответ

2

Операторы препроцессора должны быть в своих строках. Поэтому вы не можете поместить его в ту же строку, что и {, или что-либо еще, что не является частью инструкции.

+0

Хорошо, тогда я слышал это правильно, я думаю. :-) –

1

Тег #ifdef вы используете. На языке C строки, начинающиеся с # в коде, называются препроцессорными директивами. Препроцессор удаляет их и использует их в качестве команд для изменения файла кода до компиляции.

Для такого утверждения для препроцессора он должен начинаться в новой строке, и до # допускается только пробел. Вы не должны ставить его после {.

Для вашего кода компилятору понравится, если он может быть устроен следующим образом.

#include<stdio.h> 
#define NUM 10 
main() 
{  
#ifdef NUM 
    printf("compilation succesfull"); 
#endif 
} 
1

Препроцессор не в состоянии понять строку:

{ #ifdef NUM 

компилятор не знает, как обращаться с заявлением #ifdef NUM, он будет говорить # неизвестно и неизвестный тип ifdef.

он будет достигать линии

#endif 

но не видел ifdef раньше, таким образом, вы получите #endif without #if ошибку.

При замене его в новой строке, то препроцессор знает, что делать и на выходе будет:

main() 
{ 
    printf("compilation succesfull"); 
} 

Проверить это, запустив gcc -E yourprogram.

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