C - структура программы (избегающий глобальных переменных, включает, и т.д.),

Я использую 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 );

Извините, если это сбивает с толку.

6
задан guitar- 8 July 2010 в 23:13
поделиться

5 ответов

«Как действительно большие приложения избегают использования глобальных переменных?»

  1. Используйте статические переменные. Если функции необходимо что-то запомнить между вызовами, используйте это вместо глобальных переменных. Пример:

     int running_total (int num) {
    статическая сумма int = 0;
    сумма + = число;
    сумма возврата;
    }
    
  2. Передавать данные через параметры, чтобы значение определялось в одном месте, например main () , и передавалось туда, где оно необходимо.

  3. Если ничего не помогает, используйте глобальную, но постарайтесь смягчить потенциальные проблемы.

    1. Как минимум, используйте соглашения об именах, чтобы минимизировать потенциальные конфликты. Например: Gbl_MyApp_DeveloperName . Таким образом, все глобальные переменные будут начинаться с части Gbl_MyApp_ - где «MyApp» - это что-то, описывающее ваше приложение.
    2. Попробуйте сгруппировать функции по назначению, чтобы все, что требует данного глобального, находилось в одном файле (в разумных пределах). Затем можно определить глобальные переменные и ограничить их доступом к этому файлу (обратите внимание на ключевое слово extern ).
8
ответ дан 8 December 2019 в 17:18
поделиться

Это просто - просто не используйте их. создайте то, что было бы глобальными переменными в вашей функции main (), а затем передайте их оттуда в качестве параметров функциям, которые в них нуждаются.

2
ответ дан 8 December 2019 в 17:18
поделиться

Есть несколько допустимых вариантов использования глобальных переменных. В школах начали учить, что они злы, чтобы удерживать программистов от лени и чрезмерного их использования. Если вы уверены, что данные действительно нужны во всем мире, используйте их. Учитывая, что вы беспокоитесь о том, чтобы хорошо выполнять свою работу, я не думаю, что вы слишком сильно ошибетесь, исходя из собственного суждения.

2
ответ дан 8 December 2019 в 17:18
поделиться

Глобальные переменные почти неизбежны. Однако ими часто злоупотребляют. Они не заменяют передачу правильных параметров и разработку правильных структур данных.

Каждый раз, когда вам нужна глобальная переменная, подумайте: а что, если мне понадобится еще одна такая же?

0
ответ дан 8 December 2019 в 17:18
поделиться

Лучшим рекомендуемым открытым программным обеспечением для изучения C в моем колледже был Linux, поэтому вы можете взять примеры из его исходников.

1
ответ дан 8 December 2019 в 17:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: