Использование #undef в C ++ - PullRequest
       8

Использование #undef в C ++

8 голосов
/ 11 августа 2011

Я изучаю кусок кода из библиотек GSL и озадачен несколькими строками в начале заголовочного файла. Я понимаю, что делают #undef, #ifdef и т. Д., Но я не понимаю, почему они в основном сбрасывают определение _BEGIN_DECLS и затем продолжают и определяют его снова? Технически, не должно быть никаких предыдущих определений, верно? Я имею в виду, что эти вещи являются статичными и не подлежат изменениям. Во всяком случае, вот выдержка из кода:

    #undef __BEGIN_DECLS
    #undef __END_DECLS
    #ifdef __cplusplus
    # define __BEGIN_DECLS extern "C" {
    # define __END_DECLS }
    #else
    # define __BEGIN_DECLS /* empty */
    # define __END_DECLS /* empty */
    #endif

Ответы [ 2 ]

10 голосов
/ 11 августа 2011

Вы не можете #define макрос, который уже определен, если только списки параметров и списки замены не идентичны.

Если ранее было определено, что __BEGIN_DECLS заменено чем-то отличным от extern "C" {, #define __BEGIN_DECLS extern "C" { будет недействительным, и программа будет некорректной.

Технически, не должно быть никаких предыдущих определений, верно?

Могло быть, конечно.

2 голосов
/ 11 августа 2011

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

Таким образом, поскольку вы не можете определить его поверх другого определения, сначала вы вызываете #undef, а затем #define.

Иногда целесообразно использовать #ifdef или #ifndef.

...