2012-12-01 19 views
5

Nếu tôi sử dụng một số nguyên trong #define, thì data type nào được coi là ở số sprintf() trong C99?Loại dữ liệu nào là số nguyên trong #define?

#define NUMBER 100 

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

Nó sẽ không tương đương với 'sprintf ("% i \ n", 100) '? –

+1

Quy tắc ngón tay cái: Macro là bản sao và dán văn bản. :) – Mysticial

Trả lời

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

Lưu ý: U và L cũng có thể ở dạng chữ thường
Note2: U có thể đứng trước hoặc sau khi L hoặc LL

+1

Câu trả lời rất hay, tôi không biết điều này. –

3

Loại chữ đó là int. Bạn nên sử dụng %d hoặc %i.

NUMBER được thay thế bằng 100 khi biên dịch bằng bộ tiền xử lý. Thực tế là nó là một macro có nghĩa là không có gì để trình biên dịch, bởi vì trình biên dịch không bao giờ thấy NUMBER; trình biên dịch chỉ thấy 100.

2

Tất cả #define mục -d là thay thế văn bản đơn giản: hãy tưởng tượng rằng các 100 được dán trong thay vì nhận dạng NUMBER:

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

Kể từ 100 là một số nguyên theo nghĩa đen, bạn nên sử dụng %d.

+0

Bạn nói đúng, tôi đã quên biến trong sprintf()! –

Các vấn đề liên quan