2011-05-03 7 views
3

main() 함수 안에 뭔가가 포함되어 있는지 알고 싶습니다.main() 함수 안에서 #include

예를 들어, Cell 프로그램에서 나는 나중에 변경하려는 main() 함수의 cache-api.h에 대한 매개 변수를 정의합니다.

#define으로 정의 된 내용은 프로그램의 어느 곳에서나 #undef으로 정의되지 않았지만 필요한 매개 변수를 다시 정의한 후에 cache-api.h를 다시 포함해야한다는 것을 이해했습니다. 그게 가능하니?

이 문제를 어떻게 해결할 수 있습니까? cache_rd(...)으로 주 기억 장치로부터 읽어 들이고 싶지만, SPU의 실행 중에 타입이 다른 경우, 같은 프로그램으로 #define CACHED_TYPE struct x#define CACHED_TYPE struct y를 어떻게 사용할 수 있습니까?

미리 답변 해 주셔서 감사 드리며, 나는 표현이 분명하기를 바랍니다.

+0

우아하게 해결하려면 객체 지향 언어로 전환하고 다형성을 사용하여 런타임 중에 두 언어를 선택하십시오. – Blindy

+0

불행하게도 나는 그것을 할 수 없다. 나는 Cell에 있고 나는 C를 사용한다. – Madrugada

+1

당신의 프로그램을 다른 파일들로 분리하고 다른 정의들을 파일 단위로 지역화한다. –

답변

1

#define#include 사전 프로세서 매크로입니다.

귀하의 질문에 대답하려면 ... 아니, 당신은 정말로 그 일을하고 싶지 않을 것입니다. 적어도 그 혼란을 푸는 노력을 해야하는 다음 사람을 위해서입니다.

+0

그 질문은 첫 번째 질문에만 답하고 두 번째 질문은 더 우아하게 해결할 수있는 방법을 묻습니다. – Clifford

+0

하지만 정말 필요할 때 할 수 있을까요? –

3

#define#include은 기술적으로 선택적 단계 인 컴파일의 '사전 처리'단계에서 발생하는 텍스트 작업입니다. 그래서 당신은 모든 종류의 방법으로 그것들을 혼합하고 매치 할 수 있으며, 전처리 구문이 올바르다면 올바르게 동작 할 것입니다.

그러나 매크로를 #undef으로 재정의하면 동일한 텍스트가 코드의 다른 위치에서 다른 의미를 가질 수 있으므로 코드를 따르기가 어려울 수 있습니다.

맞춤형의 경우 은 컴파일러의 형식 검사 메커니즘의 이점을 여전히 활용할 수 있으므로 주위에 예기치 않은 부작용이있는 #define 매크로보다 훨씬 적게 오류가 발생하기 때문에 훨씬 선호됩니다 암호.

+0

그게 문제라고 생각했는데 내 기능 #include 다음에 주 함수 안에 'CACHE_cache_lock'이라는 함수에 대한 잘못된 저장 클래스가 있습니다 .... (더 많은 기능) .. 내가 그걸 어떻게 이해할 수 있을까요? – Madrugada

2

네, 괜찮습니다 (가장 명확한 설계 결정이 아닐 수도 있지만) #include는 #include가있는 코드에 해당 파일을 복사하여 붙여 넣는 것과 같습니다. http://en.wikipedia.org/wiki/C_preprocessor

그들은 변환됩니다/편집하기 전에 인라인 :

0

할 수 있습니다 #include어떤 파일에서 파일. 유효한지 여부는 파일의 내용에 따라 다릅니다. 특히 텍스트로 직접 입력 한 경우 해당 내용의 유효성 여부를 결정합니다.

헤더 파일은 일반적으로 함수 정의 외부 (또는 모든 종류의 인코딩 구조 외부)에서만 유효하는 선언과 구문을 포함합니다. 단서는 헤더 파일에 있습니다. 그렇지 않으면 선언 범위를 변경하거나 컴파일 단위가 구문 적으로 유효하지 않게 렌더링 될 수 있습니다.

특별히 목적을 위해 작성된 포함 파일은 괜찮을 수 있지만 임의의 헤더 파일은 아닙니다.

일반용 헤더 파일에는 다중 선언을 방지하는 가드가 있어야하므로 보호 매크로를 정의 해제하지 않으면 헤더 파일을 다시 포함해도 아무런 영향을 미치지 않습니다.

문제를 해결할 수있는 방법 중 하나는 호출해야하는 API에 래퍼 함수가 포함 된 별도로 컴파일 된 모듈 (컴파일 단위)을 만드는 것입니다. 각 컴파일 단위는 적절한 구성 매크로를 정의한 후 API 헤더 파일을 포함 할 수 있습니다. 그런 다음이 랩퍼 함수가 제공하는 두 개의 독립적이고 독립적 인 인터페이스를 갖게됩니다.

관련 문제