Como definir um símbolo de pré-processador no Xcode

100

É possível definir um símbolo para compilação condicional configurando propriedades em um projeto Xcode?

Meu objetivo é criar um símbolo que esteja disponível para todos os arquivos, sem a necessidade de importar / incluir, para que um conjunto de classes comuns possa ter um comportamento especial em alguns projetos. Como o seguinte, mas com meus próprios símbolos.

#if TARGET_IPHONE_SIMULATOR
    ...
#endif
Steph Thirion
fonte

Respostas:

116

Vá para as configurações de destino ou projeto, clique no ícone de engrenagem no canto inferior esquerdo e selecione "Adicionar configuração definida pelo usuário". O novo nome da configuração deve ser GCC_PREPROCESSOR_DEFINITIONSe você pode digitar suas definições no campo à direita.

De acordo com os comentários de Steph, a sintaxe completa é:

constant_1=VALUE constant_2=VALUE

Observe que você não precisa dos '=' s se quiser apenas # definir um símbolo, em vez de dar a ele um valor (para #ifdefinstruções)

Ben Gottlieb
fonte
2
Obrigado! Para os interessados, a sintaxe parece "kVarOne = 5 myVar = 3.0" (sem as aspas), encontrei por tentativa e erro. Ben, você poderia editar sua resposta para especificar isso? Obrigado novamente.
Steph Thirion
1
Resposta incrível. Ainda tenho cabelo por causa disso. Obrigado, obrigado, obrigado. +1 (gostaria que fosse mais)
Ali Parr
11
Para sua informação, a partir do Xcode 3.2.4, "Macros de pré-processador" mapeia para GCC_PREPROCESSOR_DEFINITIONS, e o Xcode não permitirá mais definir pelo usuário (uma vez que já está disponível).
Clay Bridges
11
Este não é mais um ícone de engrenagem no canto inferior esquerdo, mas sim um ícone de adição no canto inferior direito (da guia Configurações de construção de seu destino).
Jesse Smith
1
você deve atualizar esta resposta. não há mais ícone de engrenagem
Radu Simionescu
86

Você não precisa criar uma configuração definida pelo usuário. A configuração interna "Macros de pré-processador" funciona perfeitamente. texto alternativo http://idisk.mac.com/cdespinosa/Public/Picture%204.png

Se você tiver vários destinos ou projetos que usam o mesmo arquivo de prefixo, use Macros de pré-processador não usadas em cabeçalhos pré-compilados, para que as diferenças em sua definição de macro não acionem um conjunto extra desnecessário de cabeçalhos pré-compilados.

cdespinosa
fonte
1
O que você faz se esta seção estiver faltando nas configurações de compilação?
Kevin Laity,
3
Faça o que Ben Gotliebb sugere. Mas a partir da versão 3.2.4 do Xcode, "Macros de pré-processador" mapeia para GCC_PREPROCESSOR_DEFINITIONS. Você não pode definir pelo usuário algo que já está disponível.
Clay Bridges,
41

Como um adendo, se você estiver usando essa técnica para definir strings em seu destino, é assim que eu tive que defini-los e usá-los:

Em Build Settings -> Preprocessor Macros, e sim as barras invertidas são críticas na definição:

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

E no código-fonte:

objectManager.client.baseURL = APPURL_NSString;
Stickley
fonte
Obrigado por esta solução, estou procurando por algo EXATAMENTE como isso, mas o estouro de pilha está cheio de soluções complicadas.
David P
5

Você pode usar o *_Prefix.pcharquivo para declarar macros amplas do projeto. Esse arquivo geralmente está em seu grupo Outras fontes .

gordo
fonte
3

Está em "GCC 4.2 Preprocessing" (ou apenas coloque "prepro" na caixa de pesquisa) ...

... no entanto, pela minha vida, não consigo fazer funcionar.

Eu tenho minhas configurações padrão de Depuração e Liberação e quero definir DEBUG = 1 na configuração de depuração. Mas depois de adicioná-lo como um valor:

(na janela de configurações)> Macros de pré-processador: DEBUG = 1

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

... nunca imprime / é chamado. Está me deixando louco...

choque de cabeça
fonte
10
Em vez de #if DEBUG, tente #if definido (DEBUG) ou #ifdef DEBUG
Simo Salminen
Estranhamente, me encontrei aqui em 2019, com Swift e Xcode 10.3. Qualquer pessoa com o mesmo problema descrito acima pode achar isso útil; certamente me trouxe #if DEBUGà vida :) stackoverflow.com/a/47395485/2778502
jeff-h
1

Em resposta ao comentário de Kevin Laity (veja a resposta de cdespinosa), sobre a seção de pré-processamento do GCC não aparecer nas configurações de compilação, faça com que o SDK ativo seja aquele que diz (SDK de base) depois dele e esta seção aparecerá. Você pode fazer isso escolhendo o menu Projeto> Definir destino ativo> XXX (SDK de base). Em diferentes versões do XCode (Base SDK) podem ser diferentes, como (Project Setting ou Project Default).

Depois que esta seção aparecer, você pode adicionar suas definições às Macros do Processador em vez de criar uma configuração definida pelo usuário.

Mark24x7
fonte
1

Para projetos Xcode 9.4.1 e C ++. Adicionando const char*macros de pré-processador às compilações de depuração e de lançamento .

  1. Selecione seu projeto

    selecione o projeto

  2. Selecione Configurações de compilação

    selecione as configurações de construção

  3. Pesquisar " Macros de pré-processador "

    search1 search2

  4. Abrir lista interativa

    abrir lista interativa

  5. Adicione suas macros e não se esqueça de escapar da citação

    adicionar caminho

  6. Use no código-fonte como comum 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");
    ...
Petr Javorik
fonte
0

Você pode duplicar o destino que possui a seção de pré-processamento, renomeá-lo com qualquer nome que desejar e, em seguida, alterar o valor da macro do pré-processador.

kslcam
fonte