2014-10-09 1 views
0

저는 몇 년 동안 C를 썼지 만, 물건을 구조화하는 법을 결코 배웠습니다. 방금 한 파일에서 거대한 프로그램을 만들었고 여러 기능으로 수정 된 변수에 전역 범위를 사용했습니다. 이 문제를 해결하고 내 기능을 별도의 파일로 그룹화하려고합니다. 내가 가진 가장 큰 문제는 가변 범위입니다.많은 함수에서 사용되는 변수를 선언하는 적절한 장소?

예를 들어, 하나의 변수는 서로 다른 파일에있는 두 개의 개별 함수에 의해 쓰여지고 두 개 더 읽혀 져야합니다. 나는 그것을 main.c에서 선언 할 수 있었고 다른 언어에서 extern으로 만들 수 있었다. 그러나 나는 전역 변수가 frowned되었고 그것이 엉성한 것처럼 보인다.

그래서 논리적으로 "올바른"장소를 선언 하시겠습니까? get/set 함수와 같은 것이 있어야합니까? 아니면 내 기능을 제대로 나눌 수 없다는 것을 나타내는이 문제가 있습니까?

감사합니다.

+0

좋은 방법은 변수를 .h 파일로 유지하는 것입니다 (extern 포함) .h 파일을 필요한 .c 파일에 포함시키는 것이 좋습니다. – Gopi

+0

그들을 넣을 적절한 장소는 main() 외부 main()이 아니고 그들을 필요로하는 함수로 전달하는 것입니다. –

+0

내 프로 그램에서 vars를 주력에 넣으면 ~ 10 개의 값을 4 개의 함수를 통해 전달할 수 있습니다. 나는 또한 그것을 통해 수정 사항을 반환해야합니다. – Skidlz

답변

1

변수에 대한 생각을 그만두고 값인을 생각해보십시오. 값을 필요로하는 함수에 건네 주면, 만이 필요로하는 것을 전달하고 필요한 경우 인수의 수를 줄이기 위해 구조체의 관련 값을 수집합니다. 함수가 전역에 쓰는 대신 결과를 반환하도록합니다. 이것은 C를 포함한 모든 언어로 프로그램을 구성하는 방법입니다 (Pike's Notes, 특히 규칙 5 : "데이터 지배"참조).

getter 및 setters를 전역 변수에 사용하면 안전성을 확보 할 수 있지만 그렇지 않습니다. 전 지구적인 상태로 인한 실제 문제를 해결하십시오. 프로그램의 어느 부분이 어떤 데이터를 사용하고 있는지 파악하고 그들이 올바른 순서로 데이터를 건드 리는지 확인해야합니다.

+0

값을 전달하는 것은 좋지만 변수를 변경하는 것은 문제입니다. 나는 포인터를 전달할 수있을 것 같아요. – Skidlz

+0

@Skidlz 왜 문제가됩니까? 나는 하나의 전역 변수를 사용하지 않는 C의 largish 소프트웨어 시스템에서 일했습니다. –

+0

나는 main()에 내 vars를 유지하고 값을 전달할 수 있지만 한 방향으로 만 작동합니다. 모든 수정 작업을 위해 반품을해야합니다. 권리? – Skidlz

1

malloc을 사용하여 변수를 동적으로 할당하고 변수에 대한 포인터를 함수에 전달합니다 (또는 C++를 사용하는 경우 참조로 전달). 헤더 파일에 변수를 extern으로 정의하고 필요한 경우 @pala에서 언급 한대로 해당 파일을 포함 할 수 있습니다.

포인터가 가리키는 값만 읽는 함수의 경우 '상수 포인터'로 정의 할 수 있습니다. 이렇게하면 해당 기능을 통해 실수로 콘텐츠가 업데이트되는 것을 방지 할 수 있습니다. 함수에서 메모리 위치의 주소도 일정하게 유지된다면 '상수에 상수 포인터'를 정의 할 수 있습니다. 상수 포인터와 상수 포인터에 대해서는 this page을 확인하십시오.

함수의 업데이트 된 값을 반환해도 문제가 없지만 변수를 업데이트하는 함수가 많으면 관리하기가 어려울 수 있습니다.

공통 변수를 업데이트하는 스레드가 여러 개있는 경우 동기화 문제를 피하려면 뮤텍스 또는 세마포를 사용해야합니다.

관련 문제