programing

C 소스 파일을 다른 파일에 포함하시겠습니까?

prostudy 2022. 4. 22. 20:51
반응형

C 소스 파일을 다른 파일에 포함하시겠습니까?

에 대해 괜찮은가(또는 권장/좋은 관행이라도)#include a .c다른 사람을 철하다..c철해 주시겠습니까?

제대로 사용하면 유용한 기술이 될 수 있다.

상당히 작은 공용 인터페이스와 많은 재사용 불가능한 구현 코드를 가진 복잡한 성능의 중요한 서브시스템이 있다고 가정해 보십시오.그 코드는 수천 줄에 달하고, 백여 개의 사적인 기능들과 꽤 많은 수의 사적인 데이터들이 있다.만약 당신이 비종교적인 임베디드 시스템으로 일한다면, 당신은 아마도 이 상황을 충분히 자주 다룰 것이다.

당신의 솔루션은 아마도 계층화되고, 모듈화되고, 분리될 것이며, 이러한 측면들은 다른 파일에서 서브시스템의 다른 부분을 코딩함으로써 유용하게 표현되고 강화될 수 있다.

C가 있으면 이렇게 하면 많은 것을 잃을 수 있다.거의 모든 공구 체인은 단일 컴파일 유닛에 대해 적절한 최적화를 제공하지만 외부로 선언된 모든 것에 대해 매우 비관적이다.

모든 것을 하나의 C 소스 모듈에 넣으면 - 를 얻을 수 있다.

  • 성능 및 코드 크기 개선 - 함수 호출은 많은 경우에 포함될 것이다.인라이닝이 없어도 컴파일러는 더 효율적인 코드를 만들 기회가 있다.

  • 링크 수준 데이터 및 함수 숨기기.

  • 네임스페이스 오염과 그 오염의 회피 - 당신은 덜 다루기 쉬운 이름을 사용할 수 있다.

  • 더 빠른 컴파일 및 연결.

하지만 이 파일 편집에 관한 한 터무니없이 엉망진창이 되고, 당신은 묵시적인 모듈성을 잃게 된다.이것은 소스를 여러 개의 파일로 나누고 이를 포함시켜 하나의 컴파일 단위를 생성함으로써 극복할 수 있다.

이 문제를 제대로 관리하려면 규약을 좀 부과해야 한다.이러한 것들은 어느 정도 당신의 툴체인(toolchain)에 의존할 것이지만, 몇몇 일반적인 포인터는 -

  • 공용 인터페이스를 별도의 헤더 파일에 넣으십시오. 어쨌든 이 작업을 수행해야 함.

  • 모든 보조 .c 파일을 포함하는 하나의 주 .c 파일이 있다.여기에는 공공 인터페이스에 대한 코드도 포함될 수 있다.

  • 컴파일러 가드를 사용하여 개인 헤더와 소스 모듈이 외부 컴파일 장치에 포함되지 않도록 하십시오.

  • 모든 개인 데이터 및 기능은 정적으로 선언되어야 한다.

  • .c 파일과 .h 파일 간의 개념적 차이를 유지하십시오.이것은 기존의 관습을 활용한다.차이점은 머리글에 정적 선언이 많다는 것이다.

  • 툴체인이 그렇지 않은 이유를 제시하지 않는 경우, 개인 구현 파일의 이름을 .c 및 .h로 지정하십시오.가드 포함을 사용하면 코드가 생성되지 않고 새 이름을 도입하지 않는다(연결 중에 일부 빈 세그먼트가 발생할 수 있음).다른 도구(예: IDE)가 이러한 파일을 적절하게 처리한다는 것이 큰 장점이다.

그것은 괜찮나요?그래, 컴파일할거야

추천되니?no - .c 파일은 .obj 파일로 컴파일되며, 실행 파일(또는 라이브러리)에 컴파일된 후(링커에 의해) 실행 파일(또는 라이브러리)에 함께 연결되므로 다른 .c 파일에 .c 파일을 포함할 필요가 없다.대신 다른 .c 파일에서 사용할 수 있는 기능/변수를 나열하고 .h 파일을 포함하는 .h 파일을 만드는 것이 좋을 것이다.

아니요.

빌드 환경에 따라(지정하지 않음) 원하는 방식으로 작동한다는 것을 알 수 있다.

그러나 *.c를 컴파일할 것으로 예상되는 많은 환경(IDE 및 수작업으로 조작된 Makefiles)이 있으며, 그렇게 되면 중복된 기호로 인해 링커 오류가 발생할 수 있다.

원칙적으로 이러한 관행은 피해야 한다.

#소스 포함(일반적으로 피해야 함)을 반드시 #include해야 하는 경우에는 파일에 다른 파일 접미사를 사용하십시오.

당신은 Linux에서 gcc 컴파일러를 사용하여 하나의 출력에 2개의 c파일을 연결할 수 있다.두 개의 c 파일이 있다고 가정합시다. 하나는 'main.c'이고 다른 하나는 'support.c'입니다.그래서 이 둘을 연결시키는 명령은

gcc main.c support.c -o main.out

이 방법으로 두 개의 파일이 단일 출력 main에 연결된다. 아웃풋을 실행하려면 명령을 실행한다.

./main.out

support.c 파일에 선언된 main.c에서 함수를 사용하는 경우 외부 스토리지 클래스도 사용하여 main으로 선언하십시오.

우리 팀이 .c 파일을 포함하기로 한 상황을 공유해야겠다고 생각했다.우리의 보관소는 주로 메시지 시스템을 통해 분리되는 모듈들로 구성되어 있다.이러한 메시지 처리기는 공개적이며, 작업을 수행하기 위해 많은 지역 정적 작업자 기능을 호출한다.이 민간 구현 코드를 행사하는 유일한 방법은 공공 메시지 인터페이스를 통해 간접적으로 사용했기 때문에, 우리 유닛 테스트 사례에 대한 커버리지를 얻으려고 할 때 문제가 발생했다.일부 근로자는 무릎까지 오는 기능을 하는데, 이는 적절한 커버리지를 얻기 위한 악몽인 것으로 밝혀졌다.

.c파일을 포함하면 우리가 시험할 때 흥미로웠던 기계의 톱니바퀴에 도달할 수 있는 길이 열렸다.

적절히 포함시킬 수 있다다른 원본 파일에 C 또는 .CPP 파일.IDE에 따라, 당신은 일반적으로 포함시킬 소스 파일 속성을 보고, 그것을 마우스 오른쪽 버튼으로 클릭하고 속성을 클릭하며, 컴파일/링크/제외 또는 어떤 옵션이든 선택 취소/선택 해제하여 더블 링크를 방지할 수 있다.또는 프로젝트 자체에 파일을 포함할 수 없으므로 IDE는 파일이 존재하는지조차 알지 못하고 컴파일하려고 하지 않는다.그리고 make files로 당신은 단지 컴파일하고 연결하기 위해 그 파일을 넣지 않을 것이다.

편집: 다른 답변에 대한 답신 대신 답신해서 미안해 : ()

C 파일을 다른 파일에 포함시키는 것은 합법적이지만, 당신이 왜 이것을 하고 있고 무엇을 달성하려고 하는지 정확히 알지 않는 한, 권장할 수 없는 일이다.
만약 당신이 당신의 질문 뒤에 커뮤니티가 당신의 목표를 달성하기 위한 또 다른 적절한 방법을 찾을 것이라는 이유를 여기에 게시한다면 거의 확실하다.

그런데 나는 그 질문의 두번째 부분을 놓쳤다.C 파일이 다른 파일에 포함되어 있고 프로젝트에 포함된 동일한 시간에 개체를 연결하는 이유, 즉 동일한 기능이 두 번 정의되는 경우(모두 정적이 아닌 경우)에 대한 중복 기호 문제가 발생할 수 있다.

파일 확장자는 대부분의 C 컴파일러에게는 문제가 되지 않으므로 잘 될 것이다.

그러나 makefile 또는 프로젝트 설정에 따라 포함된 c 파일은 별도의 객체 파일을 생성할 수 있다.그것을 연결하면 이중으로 정의된 기호로 이어질 수 있다.

수많은 다른 답변들은 당신이 이것을 어떻게 할 수 있는지 뿐만 아니라 왜 당신이 정상적인 상황에서 하지 말아야 하는지에 대해 다루고 있는 것 이상을 가지고 있다.그렇긴 하지만, 내가 왜 과거에 그것을 했는지 덧붙이겠다.

임베디드 개발에서는 실리콘 벤더 소스 코드를 컴파일된 파일의 일부로 갖는 것이 일반적이다.문제는 이러한 벤더가 조직과 동일한 스타일의 가이드나 표준 경고/오류 플래그 설정을 가지고 있지 않을 수 있다는 점이다.

따라서 공급업체 소스 코드를 포함하는 로컬 소스 파일을 만든 다음 이 래퍼 C 파일을 컴파일하여 포함된 소스와 해당 소스에 포함된 헤더에 문제가 없도록 하십시오.예를 들면 다음과 같다.

/**
 * @file   vendor_wrap.c
 * @brief  vendor source code wrapper to prevent warnings
 */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wnested-externs"
#include "vendor_source_code.c"
#pragma GCC diagnostic pop

이렇게 하면 스크립팅의 일부 파일에 대한 사용자 지정 플래그가 있는 대신 표준 컴파일러 플래그 집합과 코드의 특정 예외 설정이 있는 스크립팅 만들기를 사용할 수 있다.

gcc main.c vendor_wrap.c -o $(CFLAGS) main.out

C언어는 그런 종류의 #include를 금지하지 않지만, 결과적인 번역 단위는 여전히 유효한 C여야 한다.

어떤 프로그램을 .prj 파일로 사용하고 있는지 모르겠다."만들기"나 Visual Studio 같은 것을 사용하고 있다면, 독립적으로 컴파일할 수 없는 파일 없이 컴파일할 파일 목록을 설정했는지 확인하십시오.

너는 이렇게 헤더를 추가해야 한다.

#include <another.c>

참고 : 두 파일 모두 같은 위치에 배치해야 함

나는 이것을 ATMEGA 마이크로컨트롤러용 Codevison AVR에 사용하며 정상 C언어 파일에서는 작동하지 않는다.

참조URL: https://stackoverflow.com/questions/232693/including-one-c-source-file-in-another

반응형