O compilador de D define um conjunto de variáveis de macro incorporadas que você pode usar ao escrever programas em D ou arquivos de intérprete. As variáveis de macro são identificadores prefixados com um sinal de dólar ($) e são expandidos apenas pelo compilador de D ao processar o seu arquivo de entrada. O compilador de D fornece as seguintes variáveis de macro:
Tabela 15–1 Variáveis de macro de D
Nome |
Descrição |
Referência |
---|---|---|
$[0-9]+ |
argumentos de macro |
Consulte Argumentos de macro |
$egid |
ID de grupo efetivo | |
$euid |
ID de usuário efetivo | |
$gid |
ID de grupo real | |
$pid |
ID do processo | |
$pgid |
ID de grupo de processo | |
$ppid |
ID de processo-pai | |
$projid |
ID do projeto | |
$sid |
ID de sessão | |
$target |
ID do processo de destino |
Consulte ID do processo de destino |
$taskid |
ID de tarefa | |
$uid |
ID de usuário real |
Exceto para os argumentos de macro $[0-9]+ e a variável de macro $target, todas as variáveis de macro se expandem para inteiros correspondentes aos atributos do sistema, tais como ID do processo e ID do usuário. As variáveis se expandem para o valor de atributo associado ao próprio processo do dtrace atual, ou a qualquer processo que esteja sendo executado no compilador de D.
Usar variáveis de macro em arquivos de intérprete permite que você crie programas em D duradouros que não precisam ser editados toda vez que deseja usá-los. Por exemplo, para contar todas as chamadas do sistema exceto aquelas executadas pelo comando dtrace, use a seguinte cláusula do programa em D contendo $pid:
syscall:::entry /pid != $pid/ { @calls = count(); }
Esta cláusula sempre produz o resultado desejado, embora cada chamada do comando dtrace tenha um ID de processo diferente.
As variáveis de macro podem ser usadas em qualquer lugar que um inteiro, identificador ou seqüência possam ser usados em um programa em D. As variáveis de macro são expandidas apenas uma vez (ou seja, não recursivamente) quando a saída é analisada. Cada variável de macro é expandida para formar um símbolo de entrada separado, e não pode ser concatenada com outro texto para produzir um símbolo único. Por exemplo, se $pid se expandisse para o valor 456, o código de D:
123$pid
se expandiria para os dois símbolos adjacentes 123 e 456, resultando em um erro de sintaxe, em vez de um único símbolo de inteiro 123456.
As variáveis de macro são expandidas e concatenadas com texto adjacente dentro de descrições de teste de D no início das suas cláusulas de programa. Por exemplo, a cláusula seguinte usa o provedor pid do DTrace para instrumentar o comando dtrace:
pid$pid:libc.so:printf:entry { ... }
As variáveis de macro são expandidas apenas uma vez em cada campo de descrição de teste; elas talvez não contenham delimitadores de descrição de teste (:).