Xcode에서 전 처리기 기호를 정의하는 방법


100

Xcode 프로젝트에서 속성을 설정하여 조건부 컴파일에 대한 기호를 설정할 수 있습니까?

내 목표는 가져 오기 / 포함을 사용하지 않고도 모든 파일에 사용할 수있는 심볼을 만들어 공통 클래스 집합이 일부 프로젝트에서 특별한 동작을 가질 수 있도록하는 것입니다. 다음과 같지만 내 기호가 있습니다.

#if TARGET_IPHONE_SIMULATOR
    ...
#endif

답변:


116

타겟 또는 프로젝트 설정으로 이동하여 왼쪽 하단의 기어 아이콘을 클릭하고 "사용자 정의 설정 추가"를 선택합니다. 새 설정 이름은이어야하며 GCC_PREPROCESSOR_DEFINITIONS오른쪽 필드에 정의를 입력 할 수 있습니다.

Steph의 의견에 따라 전체 구문은 다음과 같습니다.

constant_1=VALUE constant_2=VALUE

( 문의 경우) 값을 제공하는 대신 기호를 #define하려는 경우 '=' 가 필요 하지 않습니다.#ifdef


2
감사! 관심이있는 사람에게 구문은 "kVarOne = 5 myVar = 3.0"(따옴표 제외)처럼 보입니다. 시행 착오를 거쳐 찾았습니다. 벤이 당신의 대답을 편집하여 그것을 지정할 수 있습니까? 다시 한 번 감사드립니다.
Steph Thirion

1
놀라운 대답입니다. 이 때문에 아직 머리카락이 있습니다. 감사합니다 감사합니다 감사합니다. +1 (더 많을 수 있기를 바랍니다)
Ali Parr

11
참고로, Xcode 3.2.4부터 "전 처리기 매크로"는 GCC_PREPROCESSOR_DEFINITIONS에 매핑되며 Xcode는 사용자 정의를 더 이상 허용하지 않습니다 (이미 사용 가능하므로).
Clay Bridges

11
이것은 더 이상 왼쪽 하단의 기어 아이콘이 아니라 대신 오른쪽 하단 (대상의 빌드 설정 탭)에있는 플러스 아이콘입니다.
제시 스미스

1
이 응답을 업데이트해야합니다. 더 기어 아이콘은 더 이상 없다
라두 Simionescu

86

사용자 정의 설정을 만들 필요가 없습니다. 기본 제공 설정 "전 처리기 매크로"는 잘 작동합니다. 대체 텍스트 http://idisk.mac.com/cdespinosa/Public/Picture%204.png

동일한 접두사 파일을 사용하는 여러 대상 또는 프로젝트가있는 경우 대신 미리 컴파일 된 헤더에서 사용되지 않는 전 처리기 매크로를 사용하여 매크로 정의의 차이가 불필요한 추가 미리 컴파일 된 헤더 집합을 트리거하지 않도록합니다.


1
이 섹션이 빌드 설정에서 누락 된 경우 어떻게합니까?
Kevin Laity

3
Ben Gotliebb이 제안한대로하십시오. 그러나 Xcode 3.2.4 버전부터 "전 처리기 매크로"는 GCC_PREPROCESSOR_DEFINITIONS에 매핑됩니다. 이미 사용 가능한 항목을 사용자 정의 할 수 없습니다.
Clay Bridges

41

부록으로이 기술을 사용하여 대상에서 문자열을 정의하는 경우 다음과 같이 정의하고 사용해야했습니다.

빌드 설정-> 전 처리기 매크로에서 백 슬래시는 정의에서 중요합니다.

APPURL_NSString=\@\"www.foobar.org\"

그리고 소스 코드에서 :

objectManager.client.baseURL = APPURL_NSString;

이 솔루션에 감사드립니다. 정확히 이와 같은 것을 찾고 있었지만 스택 오버플로는 복잡한 솔루션으로 가득 차 있습니다.
David P

5

*_Prefix.pch파일을 사용하여 프로젝트 전체 매크로를 선언 할 수 있습니다 . 해당 파일은 일반적으로 기타 소스 그룹에 있습니다.


3

"GCC 4.2 전처리"아래에 있습니다 (또는 검색 창에 "prepro"를 입력) ...

...하지만, 제 삶을 위해 그것을 작동시킬 수는 없습니다.

표준 디버그 및 릴리스 구성이 있고 디버깅 구성에서 DEBUG = 1을 정의하고 싶습니다. 그러나 값으로 추가 한 후 :

(설정 창에서)> 전 처리기 매크로 : DEBUG = 1

#if DEBUG
    printf("DEBUG is set!");
#endif 

... 인쇄하거나 호출하지 않습니다. 날 미치게 해 ...


10
#if DEBUG 대신 #if defined (DEBUG) 또는 #ifdef DEBUG
Simo Salminen

이상하게도 2019 년에 Swift와 Xcode 10.3을 사용했습니다. 위에서 설명한 동일한 문제가있는 사람은 누구나이 방법이 도움이 될 수 있습니다. 그것은 확실히 제 #if DEBUG삶을 가져 왔습니다 :) stackoverflow.com/a/47395485/2778502
jeff-h

1

빌드 설정에 표시되지 않는 GCC 전처리 섹션에 대한 Kevin Laity의 의견 (cdespinosa의 답변 참조)에 대한 응답으로 Active SDK를 그 뒤에 (Base SDK)라고 표시하면이 섹션이 표시됩니다. 프로젝트> 활성 대상 설정> XXX (Base SDK) 메뉴를 선택하여이를 수행 할 수 있습니다. XCode (Base SDK)의 다른 버전에서는 (프로젝트 설정 또는 프로젝트 기본값)과 같이 다를 수 있습니다.

이 섹션이 나타나면 사용자 정의 설정을 만드는 대신 프로세서 매크로에 정의를 추가 할 수 있습니다.


1

Xcode 9.4.1 및 C ++ 프로젝트의 경우. 디버그릴리스 빌드 const char*모두에 전 처리기 매크로 추가 .

  1. 프로젝트 선택

    프로젝트 선택

  2. 빌드 설정 선택

    빌드 설정 선택

  3. "전 처리기 매크로 " 검색

    search1 search2

  4. 대화 형 목록 열기

    대화 형 목록 열기

  5. 매크로를 추가하고 인용을 이스케이프하는 것을 잊지 마세요.

    경로 추가

  6. 소스 코드에서 공통적으로 사용 const char*

    ...
    #ifndef JSON_DEFINITIONS_FILE_PATH
    static constexpr auto JSON_DEFINITIONS_FILE_PATH = "definitions.json";
    #endif
    ...
    FILE *pFileIn = fopen(JSON_DEFINITIONS_FILE_PATH, "r");
    ...

0

전처리 섹션이있는 대상을 복제하고 원하는 이름으로 이름을 바꾼 다음 전 처리기 매크로 값을 변경할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.