2012-11-08 2 views
0

필자는 익숙한 것보다 큰 프로젝트를 진행하고 있으며 코드를 올바르게 구조화하기 위해 최선을 다하고 있습니다. 나는 마이크로 컨트롤러를 프로그래밍하고 있으며 여기에서 읽은 조언에 따라 전역 변수를 사용할 수있는 "global_variables.h"파일에 정의 된 일부 전역 변수가 있습니다.소스에 "typedef enum"을 어디에 두어야합니까?

전역 변수에 대한 typedef를 "global_variables.h"파일에도 넣습니다.

제가 실행중인 문제는 전역 변수를 사용하는 file1.c에 새로운 typedef를 매개 변수로 허용하는 function1 (new_type_t 변수)이 있다는 것입니다. 이 문제는 내가 header1 (file1.h)에 정의 된 function1 프로토 타입을 가지고 있지만, #include "global_variables.h"는 file1.c에 있기 때문에 file1.h의 함수 프로토 타입은 typedef를 보지 못한다. .

나는 이것이 일반적인 사건이라고 생각하지만 인터넷 검색은 너무 많은 도움을주지 못했습니다. 별도의 "global_variables.h"및 "global_variables_types.h"를 만들고 다른 파일의 헤더와 소스의 .c 파일에 .h 파일을 포함시켜야합니까?

+0

file1.h에서'#include "global_variables.h"'만 필요합니다. –

+0

그가 말하려는 분할은 빌딩 블록을 더 작게 만들 것이므로 다소 유연하다고 생각합니다. – Dabbler

+0

프로젝트 규모는 어느 정도입니까? 전체 크기는 1KLOC (1000 개 소스 코드 라인), 10KLOC, 100KLOC ??? –

답변

4

헤더 파일을 가지고 있다고 생각하지 않습니다. global_variables.h은 합리적인 것입니다.

프로젝트가 작은 단일 사용자 프로젝트 (예 : 50KLOC = 50,000 줄 미만의 소스 코드)이고 재사용 가능한 라이브러리를 만들지 않으려는 경우 모든 프로젝트에 대해 하나의 헤더 파일 만 있으면됩니다. 아마도 합리적인. 이 헤더 파일은 전역 변수를 선언하고 관련 유형을 선언합니다. 또한 모든 함수를 선언하고 마지막으로 모든 인라인 함수를 정의합니다. 별도의 헤더 파일 (메인 헤더 포함)에 인라인 함수를 넣는 것을 고려해 볼 수 있습니다.

재사용 가능한 코드를 작성하려면 프로젝트의 별도 서브 시스템에 대해 별도의 헤더를 만드십시오. 그러나 모든 전역 변수에 대한 헤더를 가질 필요가 없다고 생각합니다.

가장 중요한 것은 입니다. 전역 변수 집합은 최소으로 유지하십시오. 한 손의 손가락으로 전역 변수를 계산할 수 있어야합니다. 4 개 또는 5 개의 전역 변수가 필요한 경우 관련 전역 변수를 글로벌 struct에 압축하는 것을 고려하십시오.화면 크기는 글로벌 데이터에있는 경우 예를 들어, int screen_width, screen_height;를 선언하지 않는 것이 아니라

struct { 
    int width; 
    int height; 
} screen; 

물론, 진정한 것은 프로젝트에 따라 달라집니다, 그리고 아마도 빌드 체인에 따라. 일부 독점 컴파일러는 전역 구조를 사용하는 경우 실제로 최적화하지 않으며 잘못된 코드를 생성 할 수 있습니다. GCC가 잘 최적화되기 때문에 최근 GCC를 사용한다면 (크로스 컴파일러, 바람직하게는 Linux에서), 그 문제는 없습니다. 항상 좋은 조언을 연구 당신과 비슷한 무료 소프트웨어 기존의 일부 의 소스 코드가 될 것

(예를 들어 gcc -Wall -g -O2 빌드) 컴파일러의 모든 경고를 할 수 있습니다.

4

은 .. 일이 원활하게 헤더 파일에 대한 중요한 규칙의 몇 가지가 있습니다

\ 첫째, 사용 헤더 가드 다수 포함이 문제가 발생하지 않도록. 당신이 두 번 같은 헤더를 포함하는 경우 module.h에의

...

#ifndef MODULE_H 
    #define MODULE_H 
    ... 
    #endif 

지금, 그것은 중요하지 않습니다.

두 번째 규칙 (이제 헤더 가드 있음)은 각 .h 파일에 컴파일해야하는 다른 모든 규칙이 포함되어야한다는 것입니다. 이 작업을 완료하면 다른 모듈에서 하나의 헤더를 재사용하고 헤더 순서를 올바르게 수정하는 측면에서 코드가 더욱 강력 해집니다.

#ifndef MODULE_H 
    #define MODULE_H 

    #include "module2.h" // we need a type from here. 

    void myFunc(Module2Type t); 
    #endif 
1

하나의 옵션은 file1.c 대신 file1.h에 global_variables.h를 포함시키는 것입니다. 그것이 좋은 해결책인지 여부는 소스 트리에 달려 있습니다.

1

일반적인 유연한 접근 방식은연결을 사용하여 .h의 전역 변수를 선언하는 것입니다. 그런 다음 원하는 .c 파일에서 전역을 정의하십시오.

전역을 참조해야하는 경우 .h를 포함하십시오. 링커는 해당 .obj 파일에 대한 참조를 해결합니다.

실제로 전역 변수가 적을수록 누가 그것을 사용하는지 추적하는 데 더 많은 정 결함이 있습니다.

관련 문제