2010-10-10 14 views
9

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! 
+0

Sizinkiyle çatışacak başka bir dörtlü tanımlayıcı var mı? – ninjalj

+0

Çakışma yok - kod çalışıyor. Sadece merak ettiğim bir şeydi. –

+0

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.) –

cevap

4

, herhangi typedefs ile hiçbir ilgisi yoktur her türlü ile ilgili. Değişikliklerde, türünde bir hata bulunmayan adı işlev parametresi, hata ayıklayıcı çıktınızdan hemen çıkar. Eğer önişlemci çıktısında bunun değişmesini yana

, tek açıklaması yerde kodunda orada Yani bir

#define quad quad_t 

var değil quad_t için, quad için #define s aramak zorunda olmasıdır. Önişlemci çıkışında #define'un bulunmayacağı söylemeye gerek yok. Dahil olan tüm (hem doğrudan hem de dolaysız) başlık dosyalarında küresel bir arama yapmanız gerekir.