2010-07-08 2 views
6

저는 C (C++이 아닙니다)를 사용하고 있으며 전역 변수 사용을 피하는 방법을 확신하지 못합니다.C - 프로그램 구조 (전역 변수, 포함 안함 등)

저는 C, 구문 및 기본 응용 프로그램을 작성하는 방법에 대해 꽤 알맞은 이해를 가지고 있지만 프로그램을 구조화하는 올바른 방법은 확실하지 않습니다.

어떻게 큰 응용 프로그램이 전역 변수를 사용하지 않도록합니까? 나는 항상 적어도 일부는 필요 하겠지만, C로 작성된 큰 게임과 다른 응용 프로그램의 경우, 그것을 수행하는 가장 좋은 방법은 무엇일까요?

내가 볼 수있는 C 언어로 작성된 훌륭한 오픈 소스 소프트웨어가 있습니까? 내 머리 꼭대기에서 나는 생각할 수 없다. 대부분 C++ 인 것 같다.

감사합니다.

편집

는 여기에 내가 다른 프로세스 내부 단지 DLL입니다 간단한 API 후킹 응용 프로그램에서 전역 변수를 사용하는 것이 경우의 예입니다.

이 응용 프로그램은 특히 다른 응용 프로그램에서 사용되는 API 함수를 후크합니다. WriteProcessMemory를 사용하여 호출을 원본으로 덮어 쓰고 대신 내 DLL을 호출하여이 작업을 수행합니다.

그러나 un API 함수를 후킹하면 원래 메모리/기계 코드를 다시 써야합니다.

그래서, 나는 그 기계 코드를 위해 간단한 바이트 배열을 유지할 필요가있다. 하나는 hook 된 각 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); 

죄송합니다.

+1

구체적인 예를 들려 줄 수 있습니까? 글로벌 변수가 필요한 이유는 무엇이라고 생각하십니까? 99 %의 시간은 글로벌 일 필요는 없습니다. –

답변

7

"어떻게 큰 응용 프로그램이 전역 변수 사용을 피합니까?"

  1. 를 사용하여 정적 변수. 함수가 호출간에 무엇인가를 기억해야하는 경우이 함수를 전역 변수와 비교하여 사용하십시오.예 : 값이 필요한 곳으로 어쩌면 main() 한 곳을 정의하고 전달되도록 매개 변수를 통해

    int running_total (int num) { 
        static int sum = 0; 
        sum    += num; 
        return sum; 
    } 
    
  2. 패스 데이터.

  3. 다른 모든 것이 실패하면 계속 진행하고 글로벌을 사용하지만 잠재적 인 문제를 해결하십시오.

    1. 최소한 충돌 가능성을 최소화하려면 명명 규칙을 사용하십시오. 예 : Gbl_MyApp_DeveloperName. 따라서 모든 전역 변수는 Gbl_MyApp_ 부분으로 시작합니다. 여기서 "MyApp"는 앱을 설명하는 부분입니다.
    2. 함수를 용도별로 그룹화하여 주어진 글로벌을 필요로하는 모든 항목이 같은 파일에있는 이유 여야합니다. 그런 다음 전역을 정의하고 해당 파일로 제한 할 수 있습니다 (extern 키워드를주의하십시오).
+2

다른 파일에있는 정적 변수가 하나의 globals.h 파일에 접두사가 붙은 전역 변수보다 추적하기가 훨씬 어려울 것으로 보입니다. –

+0

내가 사용하는 한 가지 방법은 각 모듈이 main() 함수에서 선언 된 구조를 갖는 것입니다. 그런 다음이 구조체에 대한 포인터가 모듈의 Init() 함수와 다른 모듈 함수에 전달됩니다. 이 구조체는 모듈에서 사용되는 모든 변수를 포함합니다. 이것은 하나의 접근 방식이며 장단점이 있습니다. 한 가지 장점은 모듈을 여러 가지 방법으로 쉽게 사용할 수 있다는 것입니다. 예를 들어, 제어 루프 모듈은 이러한 방식으로 여러 제어 루프를 제어하는 ​​데 사용될 수 있습니다. – Seidleroni

1

내 대학에서 C를 배우는 데 가장 권장되는 오픈 소스 소프트웨어는 Linux이므로 소스에서 예제를 얻을 수 있습니다.

2

전역 변수에는 몇 가지 유효한 용도가 있습니다. 학교는 프로그래머들이 게으르지 않고 사용하는 것을 지키기 위해 악하다고 가르치기 시작했습니다. 데이터가 실제로 전 세계적으로 필요하다고 확신한다면 사용하십시오. 당신이 훌륭한 일을하는 것에 대해 우려하고 있다는 것을 감안할 때 나는 자신의 판단에 따라 너무 멀리 잘못 될 것이라고 생각하지 않습니다.

0

전역 변수는 거의 불가피합니다. 그러나, 그들은 종종 남용됩니다. 적절한 매개 변수를 전달하고 올바른 데이터 구조를 설계하는 대신에 사용할 수있는 것은 아닙니다.

전역 변수가 필요할 때마다 다음과 같이 생각하십시오.

+1

"필연적 인"전역 변수에 대한 구체적인 예가 있습니까? – Secure

2

간단합니다. 사용하지 마십시오. main() 함수에서 전역 변수를 생성 한 다음 해당 매개 변수를 필요로하는 함수에 매개 변수로 전달하십시오.

+1

나는 "무심코"가되기를 바랐다. 수행하기가 어렵다면 데이터가 거의 전 세계적이 아니어야했다. –

0

나는 가독성을 줄이고 오류 가능성 등의 문제를 증가, 같은, 전역 나쁜 생각합니다.

예제를 설명하겠습니다. 나는 진짜로 몇 가지 일을 main()있다. 대부분의 작업은 타이머 및 외부 인터럽트에서 발생합니다. 32 비트 마이크로 컨트롤러를 사용하기 때문에 매개 변수가없는 함수입니다. 매개 변수를 전달할 수 없으며 이러한 인터럽트 및 타이머는 비동기입니다. 가장 쉬운 방법은 글로벌 상상력이며, 버퍼를 채우는 인터럽트이고,이 버퍼는 타이머 내부에서 파싱되며, 파싱 된 정보는 다른 타이머에서 사용, 저장, 전송됩니다. 그래, 나는 주 함수에서 인터럽트 플래그와 프로세스를 가져올 수 있지만 중요한 소프트웨어를 실행할 때 그런 식으로 생각하면 좋지 않습니다.

이것은 내게 나쁜 느낌을주지 않는 유일한 전역 변수입니다 .-)