2011-08-28 16 views
5

È possibile emettere un'istruzione #define senza distinzione tra maiuscole e minuscole con il preprocessore?Maiuscole/minuscole #define

Per esempio, voglio convertire qualsiasi involucro di pippo a spameggs, vale a dire:

FooBar -> spameggs 
foobar -> spameggs 
fooBar -> spameggs 
Foobar -> spameggs 
FOOBAR -> spameggs 
FOOBAr -> spameggs (an odd possibility I know) 
etc 

La ragione di questo è che voglio #define alcune subroutine FORTRAN avere nomi diversi, e, naturalmente, sono case insensitive. Si noti che non mi interessa davvero preservare lo schema di capitalizzazione (che nell'ultimo esempio sembra un po 'assurdo).

+0

tag Rimosso - questa domanda non ha nulla a che vedere con il [FORTRAN] lingua. – Rook

risposta

4

Purtroppo, come sapete, gli identificatori C sono case sensitive. Quindi, lo sono anche i simboli del pre-processore (se uno fosse sensibile al maiuscolo e al minuscolo e l'altro no, è possibile ottenere alcuni comportamenti molto strani quando si intende modificare solo uno dei simboli con il preprocessore). Non esiste un flag di override per questo comportamento, né un costrutto alternativo define (almeno che io conosca nel front-end del compilatore GCC per C/++).

La soluzione più ovvia sarà a grep il codice per foobar, senza distinzione tra maiuscole e minuscole. Utilizzare i risultati per costruire una tabella di tutti i possibili involucri foobar e sia

  1. loro tutti corretti ad una carcassa coerente
  2. Creare un singolo file di pre-processore che fa le ridefinizioni per tutti i casi.

Nella soluzione tardi, non è necessario inquinare un codice leggibile con questo - solo macchina generare un file FixFooBar.h piena di questi rimappature, e comprendono che dove necessario.

+0

Abbastanza sconvolgente, ma gentile di quello che mi aspettavo. Avevo pensato a entrambe le soluzioni 1 e 2, speravo solo che non avrei dovuto usarle perché si sentivano hacky. – VolatileStorm

-1

Hai provato con il comando di entrata:

subroutine name1 (args) 
    entry  name2 (args) 
    entry  name3 (args) 
    .... 
    return 
    end 
+1

Questa è una domanda in C++. –