Можно ли размещать директивы препроцессора, такие как #include, только в верхней части программного кода?
Я использовал #pragma
директива внутри функций без ошибок или предупреждений (особенно #pragma pack()
). Но следующий код показывает предупреждение incompatible implicit declaration of built-in function 'printf'|
:
int main(void)
{
printf("Trial");
}
#include<stdio.h>
Кроме того, вот выдержка из моей книги. Автор имеет плохие отзывы о SO, особенно за его щедрое использование void main()
Но все же я чувствую, что ни один автор не может быть настолько плох, чтобы утверждать следующее без причины:
Каждая из этих директив препроцессора начинается с символа #. Директивы могут быть размещены в любом месте программы, но чаще всего они размещаются в начале программы, перед первым определением функции.
Можете ли вы сказать мне, обязательно ли использовать некоторые директивы препроцессора, такие как #include
в верхней части программы, в то время как другие любят #pragma
можно использовать где угодно в программе?
Редактировать После замечания OUAH я попробовал следующее, но это не дает предупреждения, это дает большую кучу ошибок.LOL.
int main(void)
{
#include<stdio.h>
printf("Trial");
}
3 ответа
#include
Директива может быть размещена в любом месте исходного файла, но в C идентификатор обычно не может быть использован до того, как он был объявлен. Вот почему вы положили #include
директива в начале вашего исходного файла.
void foo(void)
{
printf("Hello world\n");
}
extern int printf(const char *, ...); // Error, the declaration should be put
// before the actual call
Подумай об этом так. Содержимое включенного файла просто вставляется в точку в файле, где появляется директива #include. Полученный код должен быть синтаксически правильным для языка, на котором вы программируете.
Confider следующий файл:
int a;
int foo();
int main()
#include "myheader.h"
int foo()
{
return 0;
}
И файл myheader.h содержит:
{
return foo();
}
Код, который компилятор увидит после обработки препроцессором директивы #include:
int a;
int foo();
int main()
{
return foo();
}
int foo()
{
return 0;
}
Это действительный синтаксис Си. Такое использование директивы #include не рекомендуется, но дает представление о том, что это значит. Если файл myheader.h имеет следующее содержимое:
this is some garbage
which is not proper C
Тогда результирующий код будет:
int a;
int foo();
int main()
this is some garbage
which is not proper C
int foo()
{
return 0;
}
Вы можете использовать #include в любой точке файла. Это приводит к буквальному включению содержимого включенного файла в этой точке. Причина, по которой вы получаете необъявленное сообщение для printf() в вашем коде, состоит в том, что C требует, чтобы функция была объявлена перед использованием, и stdio.h имеет это объявление. Вот почему это должно быть до его использования. И почему он не может быть включен в main() в последнем примере, потому что при включении (расширении) это приводит к синтаксически некорректному C-коду.
Компилятор C будет игнорировать директиву "#pragma", так как он рассматривает строки с тегом "#" как комментарии. Похоже, вы используете openmp. Компилятор OpenMP рассматривает их (#pragma) как параллельные директивы. Надеюсь это поможет.