2012-12-01 8 views
5

Jeśli używam liczby całkowitej w #define, co data type uważa się za sprintf() w C99?Jaki typ danych to liczba całkowita w #define?

#define NUMBER 100 

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

Czy nie byłoby to równoznaczne z 'sprintf ("% i \ n ", 100)'? –

+1

Rule of Thumb: Makro to kopiowanie i wklejanie tekstu. :) – Mysticial

Odpowiedz

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() */ 

Uwaga: U i L może być również małymi
UWAGA2: U może przyjść przed lub po L lub LL

+1

Bardzo ładna odpowiedź Nie wiedziałem tego. –

3

Typ tego literału to int. Powinieneś użyć %d lub %i.

NUMBER dosłownie zostaje zastąpiony przez 100 podczas kompilacji przez preprocesor. Fakt, że jest to makro, nic nie znaczy dla kompilatora, ponieważ kompilator nigdy nie widzi NUMBER; kompilator widzi tylko 100.

2

Wszystkie -d przedmioty #define są proste podstawienia tekstowe: wyobraźmy sobie, że 100 jest wklejony w zamiast identyfikatora NUMBER:

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

od 100 jest liczbą całkowitą dosłowny, należy użyć %d.

+0

Masz rację, zapomniałem zmiennej w sprintf()! –

Powiązane problemy