Я использую C (не C++), и я не уверен, как избегать использования глобальных переменных.
У меня есть довольно достойное схватывание на C, его синтаксисе, и как записать основное приложение, но я не уверен в надлежащем способе структурировать программу.
Как действительно большие приложения избегают использования глобальных переменных? Я вполне уверен должны будут всегда быть по крайней мере некоторые, но для больших игр и другие приложения, записанные в C, что лучший способ состоит в том, чтобы сделать это?
Есть ли какое-либо хорошее, программное обеспечение с открытым исходным кодом, записанное строго в C, на который я мог посмотреть? Я не могу думать ни о ком первое, что пришло на ум, большинство из них, кажется, находится в C++.
Спасибо.
Править
Вот пример того, где я использовал бы глобальную переменную в простом приложении сцепления API, которое является просто DLL в другом процессе.
Это приложение, а именно, API-функции рычагов, используемые в другом приложении. Это делает это при помощи WriteProcessMemory, чтобы перезаписать вызов к оригиналу, и позвонить ему моему DLL вместо этого.
Однако при отсоединении API-функции, я должен записать исходную память/машинный код обратно.
Так, я должен поддержать простой массив байтов для того машинного кода, один для каждой API-функции, которая сцепляется, и существует много.
// Global variable to store original assembly code (6 bytes)
BYTE g_MessageBoxA[6];
// Hook the API function
HookAPIFunction ( "user32.dll", "MessageBoxA", MyNewFunction, g_MessageBoxA );
// Later on, unhook the function
UnHookAPIFunction ( "user32.dll", "MessageBoxA", g_MessageBoxA );
Извините, если это сбивает с толку.
«Как действительно большие приложения избегают использования глобальных переменных?»
Используйте статические переменные. Если функции необходимо что-то запомнить между вызовами, используйте это вместо глобальных переменных. Пример:
int running_total (int num) {
статическая сумма int = 0;
сумма + = число;
сумма возврата;
}
Передавать данные через параметры, чтобы значение определялось в одном месте, например main ()
, и передавалось туда, где оно необходимо.
Если ничего не помогает, используйте глобальную, но постарайтесь смягчить потенциальные проблемы.
Gbl_MyApp_DeveloperName
. Таким образом, все глобальные переменные будут начинаться с части Gbl_MyApp_
- где «MyApp» - это что-то, описывающее ваше приложение. extern
). Это просто - просто не используйте их. создайте то, что было бы глобальными переменными в вашей функции main (), а затем передайте их оттуда в качестве параметров функциям, которые в них нуждаются.
Есть несколько допустимых вариантов использования глобальных переменных. В школах начали учить, что они злы, чтобы удерживать программистов от лени и чрезмерного их использования. Если вы уверены, что данные действительно нужны во всем мире, используйте их. Учитывая, что вы беспокоитесь о том, чтобы хорошо выполнять свою работу, я не думаю, что вы слишком сильно ошибетесь, исходя из собственного суждения.
Глобальные переменные почти неизбежны. Однако ими часто злоупотребляют. Они не заменяют передачу правильных параметров и разработку правильных структур данных.
Каждый раз, когда вам нужна глобальная переменная, подумайте: а что, если мне понадобится еще одна такая же?
Лучшим рекомендуемым открытым программным обеспечением для изучения C в моем колледже был Linux, поэтому вы можете взять примеры из его исходников.