2012-12-01 6 views
5

Wenn ich eine ganze Zahl in #define verwende, was ist data type in sprintf() in C99?Welcher Datentyp ist eine ganze Zahl in #define?

#define NUMBER 100 

sprintf(buf, "%i\n", NUMBER); // is it %i, %u, %lu ? 
+2

Wäre es nicht äquivalent zu 'sprintf ("% i \ n ", 100)'? –

+1

Faustregel: Ein Makro ist Text kopieren und einfügen. :) – Mysticial

Antwort

9
#define NUMBER1 100 /* int: use "%d" or "%i" in printf() */ 
#define NUMBER2 100U /* unsigned int: use "%u" in printf() */ 
#define NUMBER3 100L /* long int: use "%ld" or "%li" in printf() */ 
#define NUMBER4 100UL /* unsigned long int: use "%lu" in printf() */ 
/* C99 */ 
#define NUMBER5 100LL /* long long int: use "%lld" or "%lli" in printf() */ 
#define NUMBER6 100ULL /* unsigned long long int: use "%llu" in printf() */ 

Hinweis: die U- und L auch in Klein
Note2 sein kann: die U vor oder nach dem L kommen kann oder LL

+1

Sehr nette Antwort Ich wusste das nicht. –

3

der Typ dieser int Literal ist. Sie sollten %d oder %i verwenden.

NUMBER wird buchstäblich mit 100 beim Kompilieren durch den Präprozessor ersetzt. Die Tatsache, dass es ein Makro ist, bedeutet nichts für den Compiler, denn der Compiler sieht nie NUMBER; der Compiler sieht nur 100.

2

Alle #define -d Artikel sind einfache Text Ersetzungen: sich vorstellen, dass die 100 wird anstelle der NUMBER Kennung eingefügt:

sprintf(buf, "%i\n", NUMBER); 
//  ^^^ It's sprintf, don't forget the buffer! 

Da 100 eine ganze Zahl wörtliche, sollten Sie %d verwenden.

+0

Sie haben Recht, ich habe die Variable in sprintf() vergessen! –

Verwandte Themen