2010-12-10 15 views
5

इस कोड पर विचार करें:Printf, विशेष रूप से 64bit

typedef int64_t Blkno; 
#define BLKNO_FMT "%lld" 
printf(BLKNO_FMT, (Blkno)some_blkno); 

यह 86 पर अच्छी तरह से और ठीक काम करता है। 64 पर, int64_t वास्तव में नहीं बल्कि एक long long की तुलना में एक long है, और जब तक long और long long 64 पर एक ही आकार के होते हैं, संकलक एक त्रुटि उत्पन्न करता है:

src/cpfs/bitmap.c:14: warning: format ‘%lld’ expects type ‘long long int’, but argument 6 has type ‘Blkno’

  1. मैं printf कैसे बता सकता है कि मैं कर रहा हूँ एक 64 बिट प्रकार गुजर रहा है?
  2. क्या #defineBLKNO_FMT जैसे उपरोक्त के रूप में उपयोगकर्ता प्रकारों के लिए चश्मा मानकीकृत करने का कोई बेहतर तरीका है?

उत्तर

10

inttypes.h से PRId64 का उपयोग करें।

Blkno एक बहुत अच्छा प्रकार का नाम नहीं है। BLKNO_FMT को PRIdBLKNO द्वारा प्रतिस्थापित किया जा सकता है।

#include <inttypes.h> 
#include <stdio.h> 

typedef int64_t Blkno; 
#define PRIdBLKNO PRId64 

int main(void) { 
    printf("%" PRIdBLKNO "\n", (Blkno)1234567890); 
    return 0; 
} 
+0

'(Blkno)' कास्ट व्यर्थ है यदि आपने सही प्रारूप विनिर्देशक का उपयोग किया है। – user502515

+3

यह व्यर्थ नहीं है, एक परिवर्तनीय कार्यों के पूर्णांक तर्क लंबे समय तक प्रचारित नहीं होते हैं। – dreamlax

+0

@ user502515: '(Blkno) के बिना 'कंपाइलर' चेतावनी उत्पन्न करता है: रूपांतरण टाइप 'लंबा' निर्दिष्ट करता है लेकिन तर्क में 'int' टाइप किया जाता है [-Wformat] '' – jfs

0

ये प्रकार 64-बिट प्रकार नहीं हैं। वे मंच-विशिष्ट हैं। उन्हें मुद्रित करने का एकमात्र पोर्टेबल तरीका intmax_t या uintmax_t पर डालना है और उन प्रकारों को मुद्रित करने के लिए सही प्रारूप विनिर्देशों का उपयोग करना है।

+1

ऐसा लगता है कि तुम गलत हो इस समय @R .. :) –

+1

दरअसल, मैं मान लिया ओपी POSIX फाइल सिस्टम से संबंधित प्रकार के साथ काम कर रहा था। ओपी प्रकार परिभाषित तो 64-बिट होने के लिए निश्चित रूप से यह 64-बिट है .. :-) –

संबंधित मुद्दे