जीडीबी के साथ कुछ सी कोड डीबग करने के दौरान, मैंने कुछ ऐसा देखा जो मैंने नहीं देखा और न ही पहले सुना है! ऐसा लगता है कि कंपाइलर (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!
क्या कोई अन्य ट्रैक्टर पहचानकर्ता है जो आपके साथ संघर्ष करेगा? – ninjalj
कोई विरोध नहीं - कोड ठीक काम करता है। यह सिर्फ कुछ था जो मैं उत्सुक था। –
सिस्टम हेडर पर एक पोक लें; मैं यह सोचने की कल्पना कर सकता था कि कहीं भी छिपकर क्वाड क्वाड क्वाड_टी' था। (उस पर आओ, अपने ही शीर्षकों को भी दोबारा जांचें।) –