Existe alguma maneira de incorporar a instrução pragma na macro com outras instruções?
Estou tentando alcançar algo como:
#define DEFINE_DELETE_OBJECT(type) \
void delete_ ## type_(int handle); \
void delete_ ## type(int handle); \
#pragma weak delete_ ## type_ = delete_ ## type
Aceito soluções de impulso (exceto para onda), se houver.
c-preprocessor
pragma
stringification
Anycorn
fonte
fonte
Respostas:
Se você estiver usando c99 ou c ++ 0x, há o operador pragma, usado como
que é equivalente a
exceto que pode ser usado em macros (consulte a seção 6.10.9 do padrão c99, ou 16.9 do projeto de comitê final c ++ 0x)
Por exemplo,
quando colocado em
gcc -E
dáfonte
__pragma()
operador de pré - processador, que infelizmente é um pouco diferente do_Pragma()
operador C99 (C99 leva um literal de string, MSVC leva tokens que não estão em uma string): msdn.microsoft.com/en-us/library/d9x1s805 .aspxUma coisa boa que você pode fazer com _Pragma ("argumento") é usá-lo para lidar com alguns problemas do compilador, como
fonte
Não, não existe uma maneira portátil de fazer isso. Então, novamente, não há nenhuma maneira portátil de usar #pragma. Por causa disso, muitos compiladores C / C ++ definem seus próprios métodos para fazer coisas do tipo pragma, e eles geralmente podem ser embutidos em macros, mas você precisa de uma definição de macro diferente em cada compilador. Se você está disposto a seguir esse caminho, geralmente acaba fazendo coisas como estas:
Caso não seja óbvio que você deseja definir
Weak_b
eWeak_e
como construções de colchetes de início e fim, porque alguns compiladores como o GCC adicionam os atributos como um adendo a uma assinatura de tipo, e alguns, como o MSC, adicionam-no como um prefixo (ou pelo menos o fizeram uma vez, já faz anos que não uso o MSC). Ter contruções de colchetes permite que você defina algo que sempre funciona, mesmo se você tiver que passar a assinatura de tipo inteira para uma construção de compilador.Claro, se você tentar portar isso para um compilador sem os atributos desejados, não há nada que você possa fazer a não ser deixar as macros se expandirem e esperar que seu código ainda seja executado. No caso de meramente advertir ou otimizar pragmas, isso é provável. Em outros casos, nem tanto.
Ah, e eu suspeito que você realmente precisa definir Weak_b e Weak_e como macros que usam parâmetros, mas eu não estava disposto a ler a documentação para saber como criar uma definição fraca apenas para este exemplo. Deixo isso como um exercício para o leitor.
fonte
Não, você não pode colocar instruções do pré-processador em instruções do pré-processador. Você poderia, entretanto, colocá-lo em uma
inline
função. Isso derrota aC
tag, no entanto.fonte
inline
, e a maioria das principais implementações do C89 tem algumas variações.inline
é outra coisa que C pegou emprestado de C ++!:)