comando cpp

Propósito

Executa a inclusão de arquivos e a substituição macro em arquivos de origem de linguagem C.

Sintaxe

/usr/ccs/lib/cpp [ -C ] [ -P ] [ -qDBCS ] [ -IDiretório ] [ -UNome ] [ -DNome [=Defin ition ]] [ -qlanglvl=Idioma ] [ InFile ] [ OutFile ]

Descrição

O comando cpp executa a inclusão de arquivos e a substituição macro em arquivos de origem de linguagem C. Ele lê InFile e grava em OutFile (entrada padrão e saída padrão por padrão.)

O comando cpp foi projetado para se adequar às diretivas de pré-processamento e instruções para a linguagem C conforme definido pelo documento "Rascunho de Norma Nacional Americana para Sistemas de Informação-Programação de Idiomas C" (X3J11/88-159).

O programa cpp reconhece os seguintes nomes especiais:

Item Descrição
__LINE__ O número da linha atual.
__DATA__ A data de tradução do arquivo de origem.
__TEMPO__ O tempo de tradução do arquivo de origem.
__STDC__ Indica uma implementação de conformidade.
__ARQUIVO__ O nome do arquivo atual.
__STR__ Indica que o compilador gerará código sequencial para determinadas funções de sequência (conforme definido em /usr/include/string.h)
__MATH__ Indica que o compilador gerará código sequencial para determinadas funções matemáticas (conforme definido em /usr/include/math.h).
__ANSI__ Indica langlvl é configurado igual a ANSI.
__SAA__ Indica langlvl é configurado igual a SAA.
__SAA_L2__ Indica langlvl é configurado igual a SAAL2.
__EXTENDED__ Indica langlvl é configurado igual a estendido.
__TIMESTAMP__ Indica a data e o horário em que o arquivo de origem foi modificado pela última vez.

Todas as linhas de diretiva cpp devem começar com um # (sinal de libra). Essas diretivas são:

Item Descrição
#define Nome TokenString Substitui instâncias subsequentes de Nome por TokenString.
#define Nome(Argumento, ...,Argumento) TokenString Substitui as instâncias subsequentes da sequência Name(Argument, . . . ,Argument ) por TokenString, em que cada ocorrência de um Argument em TokenString é substituída pelo token correspondente na lista separada por vírgulas. Observe que não deve haver nenhum espaço entre Nome e o parêntese esquerdo.
#undef Nome Ignora a definição de Nome a partir deste ponto.
#include "Arquivo" ou #include <Arquivo> Inclui neste ponto o conteúdo de Arquivo, que cpp então processa.

Se você colocar File entre " " (aspas duplas), o comando cpp pesquisará primeiro no diretório de InFile, depois nos diretórios nomeados com o sinalizador -I e, por último, nos diretórios de uma lista padrão.

Se você usar a notação <Arquivo>, o comando cpp procura por Arquivo apenas nos diretórios padrão. Ele não procura o diretório no qual o InFile reside

#line Número ["Arquivo"] Faz com que a implementação se comporte como se a seguinte sequência de linhas de origem começava com uma linha de origem que tenha um número de linha conforme especificado por Número. Se Arquivo for fornecido, o nome presumido do arquivo será alterado para ser Arquivo.
#erro TokenString Produz uma mensagem de diagnóstico que inclui TokenString..
#pragma TokenString Uma instrução de implementação definida para o compilador.
#endif Termina uma seção de linhas iniciadas por uma diretiva de teste (#if, #ifdefou #ifndef). Cada diretiva de teste deve ter uma correspondência #endif.
#ifdef Nome Coloca as linhas subsequentes na saída apenas se:

Nome foi definido por um #define anterior

OU

Nome foi definido pela bandeira -D ,

OU

Name é um nome especial reconhecido pelo comando cpp ,

E

Nome não foi indefinido por um interveniente #undef,

OU

O nome não foi indefinido com o sinalizador -U bandeira.

#ifndef Nome Coloca as linhas subsequentes na saída apenas se:

Nome nunca foi definido por um #defineanterior,

E

Nome não é um nome especial reconhecido pelo comando cpp ,

OU

Nome foi definido por um #define anterior mas ele foi indefinido por uma interveno #undef,

OU

Name é um nome especial reconhecido pelo comando cpp, mas foi indefinido com o sinalizador -U flag.

#if Expressão Coloca linhas subsequentes na saída apenas se Expressão for avaliada para nonzero. Todos os operadores de C sem designação binária, o?: operadora, e o unário-,!, e-os operadores são legais em Expressão. A precedência das operadoras é a mesma que se definiu na Língua C. Há também um operador unário definido, que pode ser usado na Expressão nestas duas formas:
definidos (Nome) ou definidos Nome
Isto permite o utilitário de #ifdef e #ifndef em uma diretiva #if . Apenas essas operadoras, constantes de número inteiro e nomes que são conhecidos por cpp devem ser usados na Expressão. O operador sizeof não está disponível.
#elif Expressão Coloca as linhas subsequentes na saída apenas se a expressão na diretiva precedente #if ou #elif for avaliada como falsa ou estiver indefinida, e esta Expressão é avaliada como true.
#else Coloca linhas subsequentes na saída apenas se a expressão na diretiva anterior #if ou #elif for avaliada como falsa ou estiver indefinida (e, portanto, as linhas seguindo o #if e precedendo o #else foram ignoradas).

A condição de cada diretiva de teste é verificada em ordem. Se for avaliado como falso (0), o grupo que ele controla é ignorado. As diretivas são processadas apenas através do nome que determina a diretiva a fim de acompanhar o nível de condicionamento aninhado; o restante dos tokens de pré-processamento das diretivas são ignorados, assim como os demais tokens pré-processamento do grupo. É processado apenas o primeiro grupo cuja condição de controle se avalia para true (nonzero). Se nenhuma das condições for avaliada para true, e houver uma diretiva #else , o grupo controlado pelo #else é processado; faltando uma diretiva #else , todos os grupos até que o #endif sejam ignorados.

Sinalizações

Item Descrição
-C Copia comentários de linguagem C do arquivo de origem para o arquivo de saída. Se você omitira esta bandeira, o comando cpp remove todos os comentários de linguagem C, exceto aqueles encontrados em uma linha de diretiva cpp .
-DNome[=Definição] Define Nome como em uma diretiva #define . O padrão Definição é 1.
-IDiretório Looks primeiro em Directory, então olha nos diretórios na lista padrão para arquivos #include com nomes que não começam com um / (slash). Veja a discussão anterior de #include.
-P Entrada de pré-processos sem produzir informações de controle de linha para a próxima passagem do compilador C.
- qDBCS Especifica modo de conjunto de caracteres de byte duplo.
-UNome Remove qualquer definição inicial de Name, onde Name é um símbolo predefinido pelo pré-processador (exceto para os quatro indicadores do modo pré-processador: __ANSI__, __EXTENDED__, __SAA__, e __SAA_L2__). Esta sinalização não é reconhecida no modo ANSI.
-qlanglvl=Idioma Seleciona um nível de linguagem para processamento. Idioma pode ser ANSI, SAA, SAAL2ou estendido. O padrão é estendido.

Nota: Quando Idioma é estendido, _NO_PROTO não é definido automaticamente. Tal definição pode ser feita usando a opção -D no arquivo /etc/xlc.cfg .

Exemplos

  1. Para exibir o texto que o pré-processador envia para o compilador C, digite:
    /usr/ccs/lib/cpp pgm.c
    Este pré-processospgm.ce exibe o texto resultante na estação de trabalho. Você pode querer ver a saída do pré-processador ao procurar por erros em suas definições macro.
  2. Para criar um arquivo contendo texto pré-processado mais legível, digite:
    /usr/ccs/lib/cpp -P -C pgm.c pgm.i
    Este pré-processospgm.ce armazena o resultado empgm.i. Ela omita informações de numeração pretendida para o compilador C (-P), e inclui comentários do programa (-C).
  3. Para pré-definir identificadores macro, digite:
    /usr/ccs/lib/cpp -DBUFFERSIZE=512 -DDEBUG 
    pgm.c 
    pgm.i
    Isto defineBUFFERSIZEcom o valor512eDEBUGcom o valor1antes do pré-processamento.
  4. Para usar os arquivos #include localizados em diretórios não padrão, digite:
    /usr/ccs/lib/cpp -I/home/jim/include 
    pgm.c
    Isso se observa no diretório atual para arquivos #include citados, então em/home/jim/includeE, em seguida, nos diretórios padrão. Ele olha em/home/jim/includepara os arquivos #include de ângulo de ângulo (<>) e, em seguida, nos diretórios padrão.
  5. Para pré-processar com a definição ANSI, digite:
    /usr/ccs/lib/cpp -qlanglvl=ansi pgm.c

Arquivos

Item Descrição
/usr/include Diretório padrão para arquivos #include .