none
Язык C, extern глобальных функций RRS feed

  • Вопрос

  • Здравствуйте, подскажите пожалуйста, для чего extern-ят переменные в *.h?

    Например:

    file.h:

    #ifndef FILE_H
    #define FILE_H
    extern const size_t value;
    
    #endif

     file.c:

    #include "file.h" const size_t value = 1;

    В чем смысл? Ведь можно написать объявление-определение в file.h:

    #ifndef FILE_H
    #define FILE_H
    const size_t value = 1;
    
    #endif

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

    Есть ли какие-то специфические ситуации, в которых нужен extern глобальных переменных  в *.h? Или это дело вкуса/хорошего тона?





    • Изменено MGNeo 18 апреля 2018 г. 8:57
    18 апреля 2018 г. 8:55

Ответы

  • Включаемый файл защищен от повторного включения только в один исходный файл. Но никто не мешает включить его в разные исходные файлы проекта. В таком случае несколько модулей будут содержать определение одной и той же переменной. Редактор связей таких "вольностей" не позволяет.

    Поэтому, обычно делают так: переменная определяется в каком-либо ОДНОМ исходном файле, а во включаемый файл помещают объявление этой переменной с классом памяти extern (т.е. "внешняя", определенная в другом месте программы). Это делает переменную видимой во всех модулях, и, одновременно, определенной только один раз.


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа MGNeo 18 апреля 2018 г. 10:59
    18 апреля 2018 г. 9:40

Все ответы

  • Включаемый файл защищен от повторного включения только в один исходный файл. Но никто не мешает включить его в разные исходные файлы проекта. В таком случае несколько модулей будут содержать определение одной и той же переменной. Редактор связей таких "вольностей" не позволяет.

    Поэтому, обычно делают так: переменная определяется в каком-либо ОДНОМ исходном файле, а во включаемый файл помещают объявление этой переменной с классом памяти extern (т.е. "внешняя", определенная в другом месте программы). Это делает переменную видимой во всех модулях, и, одновременно, определенной только один раз.


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа MGNeo 18 апреля 2018 г. 10:59
    18 апреля 2018 г. 9:40
  • Понял, спасибо.
    18 апреля 2018 г. 10:59