2012-11-09 6 views
3

제 경우에는 코어 레이어와 응용 프로그램 레이어라는 두 개의 레이어가 있습니다. 응용 프로그램 계층은 코어 계층에 따라 다릅니다.C 또는 C++ 프로그램이 CRT 기능을 사용하지 못하게하는 방법은 무엇입니까?

코어 레이어 만 CRT 기능을 사용해야합니다.

응용 프로그램 계층에서 CRT 기능이 사용되면 컴파일하지 않아야합니다.

이것을 달성 할 방법이 있습니까? 예를 들어 응용 프로그램 계층에서 free/malloc에 ​​대한 직접 호출을해서는 안됩니다.

응용 프로그램 계층에서 직접 CRT 호출을 사용할 수 없도록 모든 CRT 기능을 # 오류로 정의하는 한 가지 방법 (응용 프로그램 계층은 코어 계층의 헤더 파일을 포함 함).

+0

왜 그렇게하고 싶습니까? –

+0

당신은 휴대용 (좋은) 방법으로 그것을 할 수 없습니다. 어떤 컴파일러를 사용하고 있습니까? # ** ** 모든 CRT 기능을 정의 할 수는 없지만 ** 사용하지 말 것을 ** 할 수는 있습니다 ... –

+3

코어 레이어 인터페이스 만 사용하여 메모리를 할당하는 방법에 대해 개발자와상의해야 할 수도 있습니다 그들의 업무를 방해하는 장벽을 창안하기보다는. – hansmaad

답변

1

CRT의 모든 기능을 # 정의 할 필요는 없습니다. 컴파일 오류를 일으키기 위해 헤더에 선언 된 함수 중 하나를 정의하는 것으로 충분합니다.

또한, 그들의 대부분도 이런 종류의 일부 구조에 의존는 CRT 헤더에 보면 :이 고유 ID를 정의하는 경우

#ifndef "some unique id" 
    #define "some unique id" 
    /* header body */ 
    #endif 

, 효과적으로 따라서, 포함되지 않는 헤더가 발생할 수 있습니다 이 헤더에 선언 된 함수를 사용하려고하면 컴파일 오류가 발생합니다.

1

모든 프로젝트가 네이티브 C 또는 C++라고 가정 할 때 Windows CRT 바이너리에 대한 참조를 제거하면 충분합니다. 누구나 사용하려고하면 링크 오류가 발생합니다.

dll의 경우 Visual Studio에서 프로젝트 속성을 열고 Configuration Properties->Linker->Input으로 이동하여 Ignore All Default LibrariesYes (/NODEFAULTLIB)으로 설정하십시오. 그 바로 위에있는 Additional Dependencies을 필요한 솔루션의 라이브러리로 설정하십시오.

정적 라이브러리의 경우 Librarian->General으로 이동하십시오.

+0

좋은 아이디어! 이 코드가 다른 프로젝트에 있어야합니다. 그러나 여기에 해당 될 것입니다. 그렇지 않으면 – SomeWittyUsername

+1

이어야합니다. 그러면 코드에 버퍼 검사 호출을 추가하는'/ GS' 옵션이 중단됩니다. 버퍼 검사의 구현은 CRT에 있습니다. 전역 코드를 호출하는 코드와 비슷한 문제가 있습니다. 그것도 CRT 코드에서 이루어집니다. – MSalters

+0

몰랐습니다. 따라서 CRT에 대한 모든 참조를 제거하면 코드가 컴파일되지만 런타임 검사는 수행되지 않습니다. 그리고 글로벌 생성자는 어떻게 될까요? 호출 할 수없는 경우 코드를 컴파일해서는 안됩니다. 나에게 아주 나쁜 디자인 같아. 이러한 종류의 것들은 CRT가 아니라 컴파일러에 의해 구현되어야합니다. –