История изменений
Исправление hobbit, (текущая версия) :
Первая - прототипы функций. Если написать вызываемую функцию ниже её вызывающей - компилятор ругнётся, что функцию не видно. Когда-то, насколько я помню, такой код вообще не компилировался. Решается добавлением прототипа функции где-то в начале файла.
Это нормально. Решается грамотным проектированием. Всё, что наружу — выносится в заголовочный файл.
Вторая - заголовочные файлы.
Плохи не сами заголовочные файлы. Сами они (как и вообще концепция препроцессора) — очень мощное средство. Плохо то, что заголовочные файлы используются в C и C++ вместо отсутствующих там модулей. В то время как в презираемом недавними школьниками объектном Паскале нормальные модули есть уже 30 лет.
Я создал заголовочный файл, в котором хранились глобальные (для всего приложения) значения. Подключаю его в нескольких .cpp файлах - линкер ругается, не может он что-то там слинковать.
Я не люблю ванг и не люблю ванговать. Но сейчас рискну: вероятно, ты вынес туда не константы и не объявления переменных, а сами переменные. Препроцессор размножил одно глобальное имя на несколько .cpp и при попытке компоновки у линкера бомбануло.
Если я угадал, это решается просто. Если тебе эти переменные ДЕЙСТВИТЕЛЬНО нужны в качестве глобальных, создаёшь два файла: globals.h и globals.cpp. В первом пишешь:
extern int someCounter;
extern double someSum;
Во втором:
int someCounter;
double someSum;
В другие файлы включаешь globals.h и всё работает. Но обычно если тебе нужно много разных глобальных переменных, скорее всего, ты делаешь что-то не так (хотя это не догма).
У отсутствия модулей есть и другие минусы. Но в C++20 модули наконец-то появились, может быть, они всё же придут окончательно. А пока просто аккуратнее пиши заголовочники и не забывай про стражи компиляции (современные IDE расставляют их автоматически).
Меня в C++ больше расстраивает отсутствие стандартной сборочной системы, из-за чего люди тащат в свои проекты разнокалиберный хтонический ужас: кто cmake, кто автотулзы… На мой взгляд, нужен стандартный декларативный формат файла проекта со строгим синтаксисом. Ошибся в синтаксисе — получил по рукам сразу. А для случаев, когда надо сделать что-то нестандартное, предусмотреть какую-нибудь секцию custom или unsafe :)
Исходная версия hobbit, :
Первая - прототипы функций. Если написать вызываемую функцию ниже её вызывающей - компилятор ругнётся, что функцию не видно. Когда-то, насколько я помню, такой код вообще не компилировался. Решается добавлением прототипа функции где-то в начале файла.
Это нормально. Решается грамотным проектированием. Всё, что наружу — выносится в заголовочный файл.
Вторая - заголовочные файлы.
Плохи не сами заголовочные файлы. Сами они (как и вообще концепция препроцессора) — очень мощное средство. Плохо то, что заголовочные файлы используются в C и C++ вместо отсутствующих там модулей. В то время как в презираемом недавними школьниками объектном Паскале нормальные модули есть уже 30 лет.
Я создал заголовочный файл, в котором хранились глобальные (для всего приложения) значения. Подключаю его в нескольких .cpp файлах - линкер ругается, не может он что-то там слинковать.
Я не люблю ванг и не люблю ванговать. Но сейчас рискну: вероятно, ты вынес туда не константы и не объявления переменных, а сами переменные. Препроцессор размножил одно глобальное имя на несколько .cpp и при попытке компоновки у линкера бомбануло.
Если я угадал, это решается просто. Если тебе эти переменные ДЕЙСТВИТЕЛЬНО нужны в качестве глобальных, создаёшь два файла: globals.h и globals.cpp. В первом пишешь:
extern int someCounter;
extern double someSum;
Во втором:
int someCounter;
double someSum;
В другие файлы включаешь globals.h и всё работает. Но обычно если тебе нужно много разных глобальных переменных, скорее всего, ты делаешь что-то не так (хотя это не догма).
У отсутствия модулей есть и другие минусы. Но в C++20 модули наконец-то появились, может быть, они всё же придут окончательно. А пока просто аккуратнее пиши заголовочники и не забывай про стражи компиляции (современные IDE расставляют их автоматически).
Меня в C++ расстраивает отсутствие стандартной сборочной системы, из-за чего люди тащат в свои проекты разнокалиберный хтонический ужас: кто cmake, кто автотулзы…