[CPreProc] C uitvoer verkrijgen?

Pagina: 1
Acties:

  • BratMokstrof
  • Registratie: Mei 2003
  • Laatst online: 05-05 17:28
Ik probeer met GCC via een leuk setje parameters enkel de C Pre-processor uit te voeren, maar dan wel op een dusdanige manier dat de uitvoer valid C is.
Kortom, ik wil dat hij alle macros e.d. resolved, de includes uitvoert en that's it. Met -E krijg ik allemaal rare toestanden, regels die eindigen op een " en de volgende regel weer met een " beginnen, enums die niet komma-seperated zijn, enz.

Dat is vrij jammer, maar iemand enig idee hoe ik dit oplos?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Kun je een stukje voorbeeld posten van het resultaat? Want de -E optie zou wel goed moeten zijn.

Overigens is een regel die eindigt met een " en een volgende die begint met de " niet per se fout:
C++:
1
2
3
4
5
int main ()
{
    std::cout << "Hallo "
        "daar" << std::endl;
}

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • BratMokstrof
  • Registratie: Mei 2003
  • Laatst online: 05-05 17:28
Een aantal interessante zaken die ik tegenkom na een gcc -E

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Geen komma?
enum
{
  __GCONV_IS_LAST = 0x0001
  __GCONV_IGNORE_ERRORS = 0x0002
};

// Wat doet die laatste ", 0" daar na de haakjes?
((void)  (( SG_textIndex > 0 ) ? 0 :  (__assert_fail ("SG_textIndex > 0" , "sglr-interface.c", 346, __PRETTY_FUNCTION__ ), 0))) ;

// Quotes einde quote begin?
  const char usage[] = "Usage:\n\t%s\t-p file [-2?bcdhlmnPtvV] "
  "[-f[adeirp]] [-i file] [-o file] \\"
  "\n\t\t[-s sort]\n";

// Dit lijkt wel een makro ...?
  IF_STATISTICS(
    maxrss = SG_ResidentSetSize();
    if(maxrss)
    fprintf(SG_log(), "[mem] exiting: %ld\n", maxrss)
  );


Overigens geeft hij warnings dat bepaalde files niet kunnen worden gevonden.
Dit kan een verklaring zijn voor de marko die blijft bestaan, maar probleem 1 t/m 3 zouden niet hoeven voorkomen lijkt me?

Het voorbeeld dat je geeft wordt niet gecompileerd. Ben je niet in de war met C++?

[ Voor 27% gewijzigd door BratMokstrof op 15-03-2005 16:14 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Mijn voorbeeldje was idd C++ code, maar het ging om de strings en dat werkt prima in C. Het is juist dé manier om een string op de volgende regel verder te laten gaan als je vindt dat hij te lang wordt. 2 opeenvolgende strings worden gewoon geconcateneerd.

C:
1
2
3
char * str = "Hallo"   "daar"
   "woei"
   "test";


str wijst nu naar de string "Hallodaarwoeitest"

Die ", 0" komt gewoon van een assert macro expansion, die de waarde checkt en zo nodig een functie aanroept. Het is echter een conditionele expressie, dus beide operands moeten hetzelfde type teruggeven, vandaar de 0.

Wat de enum en de IF_STATISTICS betreft heb ik geen verklaring, behalve dan dat de sourcecode in eerste instantie misschien al fout is, maar daar kun jij meer over zeggen dan ik :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • BratMokstrof
  • Registratie: Mei 2003
  • Laatst online: 05-05 17:28
Ja, je hebt (natuurlijk) volkomen gelijk. *zucht*

En sja, het is niet mijn code, maar het is wel compilerende code. Ik snap zelf ook niet waarom het compileert (hehe), maar het is gewoon OK... :'(