LINUX.ORG.RU

История изменений

Исправление 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, кто автотулзы…