2010-10-10 15 views
9

जीडीबी के साथ कुछ सी कोड डीबग करने के दौरान, मैंने कुछ ऐसा देखा जो मैंने नहीं देखा और न ही पहले सुना है! ऐसा लगता है कि कंपाइलर (gcc -O0) ने एक समारोह में वैक्टरों की सरणी पारित करने के लिए एक नया प्रकार बनाया है ... मुझे लगता है!क्या जीसीसी कार्यों में पारित सरणी के लिए टाइपपीफ बनाता है?

/* The Vector type - nothing unusual */ 
typedef struct { 
    float x,y,z; 
} Vector; 

/* The function I was debugging. 
* The second parameter is what seems to have changed */ 
extern void gui_shader_draw(
    guiShader *shader, 
    Vector quad[ 4 ], // << This is the one! 
    Vector origin, 
    Vector rotation, 
    Vector scale, 
    bool focus, 
    int mode); 

मैं gui_shader_draw समारोह के अंदर एक ब्रेकपाइंट सेट और यह मैं क्या देख रहा है::

break shader.c:248 
Breakpoint 1 at 0x80013ac0: file src/gui/shader.c, line 248. 
(gdb) continue 
Continuing. 
// I have split the next line 
Breakpoint 1, gui_shader_draw (
    shader=0x80588ea8, 
    quad_t=0x80585fe8, // << What the? 
    origin=..., 
    rotation=..., 
    scale=..., 
    focus=false, 
    mode=3) at src/gui/shader.c:249 

// The values quad_t points to are all good 
(gdb) print quad_t[0] 
$10 = {x = -320, y = -240, z = 0} 
(gdb) print quad_t[1] 
$11 = {x = 320, y = -240, z = 0} 
(gdb) print quad_t[2] 
$12 = {x = 320, y = 240, z = 0} 
(gdb) print quad_t[3] 
$13 = {x = -320, y = 240, z = 0} 

कहाँ quad_t से आया नीचे कोड और gdb जानकारी पर एक नज़र है? यह निश्चित रूप से मेरे किसी भी कोड में टाइपिफ़ नहीं है। सिस्टम हेडर sys/type.h में quad_t ऊर्फ (लंबा int) है लेकिन यह सभी संबंधित नहीं लगता है! क्या चल रहा है? क्या मुझे कुछ स्पष्ट याद आया है?

संपादित करें 1: मुझे यह इंगित करना होगा कि कोड संकलित करता है और ठीक काम करता है। Quad_t नामक कुछ अन्य चर या प्रकार के साथ कोई संघर्ष नहीं है। मैं केवल उत्सुक हूं कि जीसीसी ने क्या किया है और क्यों।

संपादित करें 2: के रूप में सुझाव दिया, मैं पूर्वप्रक्रमक आउटपुट पर एक नज़र है और वास्तव में 'वेक्टर ट्रैक्टर [4]' के सभी उदाहरणों था 'वेक्टर quad_t [4]' बदल दिया गया है, इसलिए नाम, बदल गया है नहीं प्रकार।

extern void gui_shader_draw(
    guiShader *shader, 
    Vector quad_t[ 4 ], 
    Vector origin, 
    Vector rotation, 
    Vector scale, 
    _Bool focus, 
    int mode 
); 

प्रीप्रोसेसर आउटपुट में 'quad_t' नामक कोई टाइपिफ़ी नहीं है। लेकिन मैं sys/types.h में यह मिला (जो मैंने पहले याद किया - डी 'ओह)

/usr/include$ find . | xargs grep -s quad_t 
./sys/types.h:typedef __uint64_t  u_quad_t; 
./sys/types.h:typedef __int64_t  quad_t; 
./sys/types.h:typedef quad_t *  qaddr_t; 
./sys/types.h:# define quad   quad_t // << There you are! 
+0

क्या कोई अन्य ट्रैक्टर पहचानकर्ता है जो आपके साथ संघर्ष करेगा? – ninjalj

+0

कोई विरोध नहीं - कोड ठीक काम करता है। यह सिर्फ कुछ था जो मैं उत्सुक था। –

+0

सिस्टम हेडर पर एक पोक लें; मैं यह सोचने की कल्पना कर सकता था कि कहीं भी छिपकर क्वाड क्वाड क्वाड_टी' था। (उस पर आओ, अपने ही शीर्षकों को भी दोबारा जांचें।) –

उत्तर

4

क्या अपने कोड में होता है, बिल्कुल कुछ भी नहीं किसी भी typedefs के साथ क्या करना है के बाद से परिवर्तन कोई रास्ता नहीं में है किसी भी प्रकार से संबंधित है। परिवर्तन में नाम फ़ंक्शन पैरामीटर का प्रकार नहीं है, जो आपके डीबगर आउटपुट से तुरंत स्पष्ट है।

जब से तुम पूर्वप्रक्रमक उत्पादन में है कि परिवर्तन देखते हैं, केवल उचित व्याख्या यह है कि कोड में कहीं वहाँ एक

#define quad quad_t 

है तो तुम, quad के लिए #define रों देखने के लिए quad_t के लिए नहीं है। कहने की जरूरत नहीं है कि #define प्रीप्रोसेसर आउटपुट में मौजूद नहीं होगा। आपको सभी शामिल (सीधे और अप्रत्यक्ष रूप से) शीर्षलेख फ़ाइलों में एक वैश्विक खोज करना है।