Bazı C kodlarını gdb ile hata ayıklarken, daha önce hiç görmediğim veya duymadığım bir şeye rastladım! Derleyici (gcc -O0) bir dizi vektörü bir işleve geçirmek için yeni bir tür oluşturmuş gibi görünüyor. Sanırım!GCC, işlevlere geçirilen diziler için typedef'ler oluşturur mu?
/* 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);
Ben gui_shader_draw işlevi içinde bir kesme noktası ayarlamak ve bu gördüğüm şudur::
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}
nereden geliyor quad_t vermedi Aşağıdaki kod ve gdb bilgilere bir göz var mı? Hiçbir kodumda kesinlikle bir yazım hatası yok. Sistem başlığı sys/types.h bir quad_t takma ada sahip (uzun int) ama bu hiç alakalı değil! Neler oluyor? Bariz bir şeyi özledim mi?
DÜZEN 1: Kodun derlendiğini ve düzgün çalıştığını belirtmem gerekir. Quad_t adı verilen başka bir değişken veya tipte çatışma yoktur. Sadece GCC'nin ne yaptığını ve nedenini merak ediyorum.
DÜZEN 2: Önceden belirtildiği gibi, önişlemci çıktısının üzerine bir göz attım ve gerçekten de 'Vector quad [4]' ün tüm örnekleri 'Vector quad_t [4]' olarak değiştirildi, böylece ad değişmedi, yazın.
Ön işlemci çıkışında 'quad_t' adı verilen yazım hataları yoktur. Ama sys/types.h bunu buldum (daha önce cevapsız hangi - Ah d') değişiklik hiçbir şekilde olduğundan kodunuzda ne olur
/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!
Sizinkiyle çatışacak başka bir dörtlü tanımlayıcı var mı? – ninjalj
Çakışma yok - kod çalışıyor. Sadece merak ettiğim bir şeydi. –
Sistem başlıklarında bir poke yapın; Bir yerde gizlenen #define dörtlü quad_t olduğunu düşünebiliyordum. (Buraya gel, kendi başlıklarını da iki kere kontrol et.) –