Можно ли размещать директивы препроцессора, такие как #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) как параллельные директивы. Надеюсь это поможет.

Другие вопросы по тегам