Я хочу поместить определения массива в исходный файл C или C ++.
================================================================

ю, что это вопрос, который должен знать каждый программист, но я не знаю. Давненько не программировал на С, и я много чего забыл.

Мой вопрос:

У меня есть три огромных статических массива, определенных в заголовочном файле. Кто-то сказал мне, что лучше объявить их`extern` в заголовочном файле и определите их в одном исходном файле на C или C ++.

Как я могу это сделать?

Вот мой заголовочный файл:

Если я использую исходный файл C ++, могу ли я определить класс?

**ОБНОВИТЬ:**  
Я думаю, что проблема заключается в:  
Каждый исходный файл, в который включены эти заголовки (даже косвенно), будет генерировать свое собственное определение для этих статических массивов. Нет гарантии, что компилятор / компоновщик оптимизирует их в одно определение, даже в исходных файлах, где они не используются. Фактически, во многих случаях компилятор не может их оптимизировать. Это может привести к тому, что ваши статические данные будут занимать много места на диске, а также, возможно, оперативную память.

Спасибо.

`static` а также`extern` в то же время не имеет смысла.`static` в области видимости файла делает массив недоступным для других файлов, в то время как`extern` сообщает компилятору, что ваш массив определен где-то еще.

Вы можете делать то, что предлагает 321008,за исключением того, что вы не объявляете свои массивы статическими что запрещено C и C ++. Это дает вам три глобальные переменные, которые вы можете использовать везде, где включен заголовочный файл.

Например, вот так:

Или вы можете делать то, что предлагает Фортран, но это даст вам доступ только к области файла, а не к глобальным переменным.

Вы делаетене в любом случае нужно определить класс, если вы используете исходный файл C ++. В отличие от Java, C ++ не принуждает вас к объектно-ориентированному дизайну (может ли это обсуждаться хорошо или нет, но в любом случае).

РЕДАКТИРОВАТЬ: Что касается обновления вашего вопроса, это потому, что вы определяете их как`static`, Если вам нужны только глобальные переменные, вы не должны этого делать, а вместо этого оставить одно определение (`const float`) и сослаться на это`extern`согласно моему примеру выше.



 Я продемонстрирую на более простом примере простую примитивную константу.

В вашем проекте у вас есть два файла`pi.h` а также`pi.cpp`.

Содержание`pi.h` выглядит так:

Константы`pi.cpp` выглядит так:

Если вы хотите использовать эту константу, вы просто включаете`pi.h` где необходимо. Значение всегда будет читаться из одного места.

То же самое можно сделать практически с чем угодно - массивами, объектами, массивами объектов, контейнерами STL и т. Д. Просто убедитесь, что вы не злоупотребляете этой техникой, особенно когда объекты объявлены`extern` не`const`Вы можете создать некоторые действительно трудно отследить побочные эффекты. Но для постоянных данных, это вы это делаете.



Ваш заголовочный файл становится:

Пока ваш исходный файл становится:

Обновление: если вы указываете массивы явно, вам не нужно указывать размеры. То есть вы можете сделать:

или же



 который на самом деле был просто необычным способом использования include:

просто сделать:

и т.п.

И храните только данные во включенных файлах.

Вы все еще можете объявить их как`extern` в модуле компиляции, но это немного опрятно.



  
Я обычно использую простой трюк.

а) В каждом файле C / CPP я определяюимя файла\_C  
б) В каждом файле H / HPP я определяюимя файла\_ЧАС

чем ...

Это будет ваш включаемый файл

Если я не ошибаюсь, это грязная работа (или что-то очень похожее на это) ...: o)