Почему иногда полезно написать оператор включения в кодовом блоке? - PullRequest
1 голос
/ 28 мая 2019

Я пришел из фона Python, где действует следующее:

def f():
    import someLibrary
    someLibrary.libraryFunction()

Поэтому, когда мне нужно было отладить код C, я писал в середине моей функции:

void f(int param)
{
     int status;
     /* other code */
     #include <stdio.h>
     printf("status: %d", status);
     /* more code */
}

И это скомпилировано и работает, как я ожидал.Позже мне было указано, что это не должно компилироваться, поскольку препроцессор C буквально заменяет #include~ statement with the contents of stdio.h`.Так почему же этот действительный код?

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Да, C и Python довольно разные в этом отношении.

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

Приводит ли это к ошибке компиляции или нет, полностью зависит от содержимого включенного файла. Стандартные заголовки, такие как stdio.h, не содержат никаких исполняемых операторов - они содержат только такие вещи, как typdefs, объявления функций, другие макросы и т. Д. У них также обычно есть какие-то элементы защиты #include, которые не позволяют им загружаться более один раз за единицу перевода (то есть, если вы #include файл, который включает stdio.h, а затем #include <stdio.h> непосредственно в том же исходном файле, содержимое stdio.h будет загружено только один раз).

Теоретически , нет проблем с включением stdio.h в случайных точках в коде, но это может привести к проблемам. В этом случае все содержимое stdio.h будет видно только телу f - не проблема, если только f нужно что-либо использовать в stdio.h, но в противном случае это приведет к головным болям.

Стандартные заголовки лучше всего включать в начале исходного файла.

0 голосов
/ 28 мая 2019

мне было указано, что это не должно компилироваться, поскольку препроцессор C буквально заменяет инструкцию #include содержимым stdio.h.

Логика наэто не имеет смысла.Тот факт, что препроцессор вставляет текст из файла stdio.h, не означает, что он не должен компилироваться.Если в этом файле нет ничего, что могло бы привести к ошибке компиляции, он будет прекрасно скомпилирован.

Более того, заголовки обычно имеют защиту от множественного включения.Так что, если они были включены уже ранее, любые дальнейшие попытки включить его не имеют никакого эффекта.В этом случае, если <stdio.h> уже был ранее включен в файл (прямо или косвенно), #include не будет иметь никакого эффекта.

С учетом сказанного не делайте этого, хотя.В C стандартные заголовки не должны включаться в область действия функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...