#c #compilation #global-variables
#c #Сборник #глобальные переменные
Вопрос:
Итак, допустим, у меня есть два файла, main1.cc
и main2.cc
, каждый с функцией main и каждый с набором глобальных переменных, определенных в их соответствующих файлах:
main1.cc:
int main1_global = 1;
int main() {
// I am main 1
}
main1_globals.h:
extern int main1_global;
main2.cc:
#include "main1_globals.h"
int main2_global = 2;
int main() {
// I am main 2
}
Проблема в том, что main2.cc использует main1_global, и если я пытаюсь связать и скомпилировать main2, то он жалуется, что существует несколько определений main .
В идеале я не должен связывать main1 с main2, но я хочу, чтобы main2 включал глобальные переменные из main1. Каков наилучший способ связать глобальные переменные из main1 в main2 без привязки main1?
Комментарии:
1. Но у вас есть несколько определений
main
. Это не разрешено.2. Отредактировал мой пост, потому что это было непонятно. Я знаю, что существует два определения main, просто интересно, какой наилучший способ включить глобальные переменные main1 в main2 без привязки main1.
3. я не понимаю. Что именно означает «поделиться»? Должна ли модификация
main1_global
в executable1 быть видимой в executable2? (Интересно, можно ли было бы модифицировать компоновщик для размещения глобальных переменных в общей памяти …)4. О, так вы написали 2
main
s, потому что пытаетесь решить проблему «совместного использования глобальных переменных»? Если это так, вопрос вводит в заблуждение; он читается так, как будто у вас уже было 2main
s по какой-то другой причине.5. Я думаю, что я хочу не делиться, а просто пытаться импортировать глобальные переменные из одного места, не сталкиваясь с проблемами связывания.
Ответ №1:
Поместите ваши константы в отдельный файл, например globals.h . Затем включите этот файл в оба ваших исполняемых файла.
Комментарии:
1. вы инициализируете и определяете глобальные переменные в globals.h?
2. Как будет выглядеть этот файл, если оба модуля .c будут включать его?
Ответ №2:
Как разделить глобальные переменные между двумя исполняемыми файлами?
В большинстве операционных систем каждый исполняемый файл (полученный путем компиляции и последующего связывания файлов C ) выполняется в своем собственном процессе, и каждый процесс имеет свое собственное виртуальное адресное пространство. Подробнее читайте в каком-нибудь хорошем учебнике по операционным системам.
На практике вы не можете легко совместно использовать глобальные переменные, а когда вы могли бы, возникает проблема синхронизации (что произойдет на многоядерном процессоре, когда на одном ядре одновременно выполняется исполняемый файл 1, а на другом — исполняемый файл 2?).
Вы, вероятно, хотите некоторого взаимодействия между процессами. Когда это возможно, совместное использование глобальной переменной может быть дорогостоящим в процессорном времени.
Если в Linux, см. системные вызовы (2), mmap(2), канал (7), сокет (7), опрос (2), shm_overview(7), sem_overview(7)
Для Windows изучите WinAPI
Вы могли бы перепроектировать архитектуру своего программного обеспечения для использования многопоточности, например, C std::thread
-s, но тогда вам, вероятно, понадобятся также std::mutex
для целей блокировки и std::condition_variable
-s для синхронизации.
Имейте в виду проблемы с кэшем процессора и когерентностью кэша. Даже если вы используете глобальную переменную, у вас могут возникнуть проблемы с производительностью.
Вы можете перепроектировать свое приложение, чтобы использовать парадигму передачи сообщений, например, с помощью JSONRPC, MPI или ONCRPC. Конечно, отправка сообщения обходится дорого (но это основа облачных вычислений в центрах обработки данных). Это может занять миллисекунды, а не наносекунды.