2016-04-09 28 views
4

Aşağıdaki kod snippet'lerinde glade_project_get_type işlevi için uygulama kodu eksikliğinden şaşıyorum.Bildirilen C işlevi nasıl uygulanamaz?

GType glade_project_get_type (void) G_GNUC_CONST; 

/* From glib/gmacros.h: 
    #define G_GNUC_CONST __attribute__((__const__)) 

    __attribute__((const)) function attribute 
Many functions examine only the arguments passed to them and have no effects 
except for the return value. 
If a function is known to operate only on its arguments then it can be subject 
to common sub-expression elimination and loop optimizations. 
*/ 

Hiçbir yerde bulabilirim:

#define GLADE_TYPE_PROJECT (glade_project_get_type()) 

Bu glade_project_get_type() beyanı gibi görünmektedir: birleşik başlık dosyasından

project = g_object_new (GLADE_TYPE_PROJECT, NULL); 

: .c dosyasından

glade_project_get_type() için uygulama kodu ancak yazılım hatasız derleniyor Belli ki, anlamadığım bir şey var.

GType glade_project_get_type (void) 
{ 
    GType aType; 

    < some code giving a value to aType > 
    return aType 
} 

Yani, C programlama hakkında anlamıyorum:

yere böyle bir şey meydana geldiği düşünülmektedir?

cevap

4

glade_project_get_type'u uygulayan kod, numaralı kitaplıkta ve ayrı olarak derlenen ve glade yürütülebilir dosya ile bağlantılı olan kitaplıktadır.

libgladeui için kaynak kodu glade bu birlikte sevk edilir. glade_project_get_type işlevinin tanımı glade-project.c dosyasındadır.

G_DEFINE_TYPE_WITH_CODE (GladeProject, glade_project, G_TYPE_OBJECT, 
         G_ADD_PRIVATE (GladeProject) 
         G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL, 
               glade_project_model_iface_init) 
         G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_DRAG_SOURCE, 
               glade_project_drag_source_init)) 

Bu makro başlık dosyalarında tanımlanmıştır: fonksiyon için gerçek kod glade_project_get_type aşağıdaki hatlar gelen karmaşık bir makro genişlemesi sonucu çünkü bu dosyada dize glade_project_get_type bulamazsınız glib, özellikle gobject/gtype.h için. Genişletme işleminin bir noktasında, token pasting (## önişlemci yönergesi), makroya geçirilen sembollerden birini (burada glade_project) almak ve _get_type ile bitiştirilmiş bir simge olan adı tanımlamak için kullanılacaktır. İlk bakışta, program my_magic_function bir tanımını içerecek şekilde görünmüyor olsa

#define MAKE_FUNC(name, val) int my_ ## name ## _function (void) { return val; } 

MAKE_FUNC(magic, 42) 

int main(void) { 
    printf("%d\n", my_magic_function()); 
    return 0; 
} 

, makro MAKE_FUNC aslında onu oluşturmak için genişler:

İşte burada neler olduğunu basit bir örnektir.MAKE_FUNC(magic, 42) genişlemesi sadece o açıklıktan tahmin

int my_magic_function(void) { return 42; } 
+0

Çok yardımcı olan açıklamalarınız için teşekkürler ama hala tam bir anlayış eksikliği. Glade-project.c dosyasında "glade_project_get_type 'ın şu satırlarını buldum ama bunların glade_project_get_type() ile nasıl ilişkili olduğunu anlamıyorum. Kitaplarımda herhangi bir açıklama bulamadığım için bu mekanizmayı açıklayan bir kitap var mı? – Roger

+0

Daha fazla arama yaptıktan sonra ana bilgi kaynağı GObject Referans kılavuzudur? – Roger

+0

@Roger: Muhtemelen. Korkarım genelde Glade'in genel olarak nasıl çalıştığını bilmiyorum. Bu kodun nasıl derlendiğine dair sorunuzu yanıtlamayı düşünüyordum, ama aslında nasıl kullanacağım konusunda yardımcı olamıyorum. Yeni bir soru sormak isteyebilirsiniz. –

2

fonksiyonu glade_project_get_type() bir kütüphane, örneğin, derlendi libglade. Bu kütüphanenin ham kaynak kodu tam olarak bir tanım içermez, çünkü bu işlevin kaynak kodu here görüntülenebilir bir şablondan üretilir. Yalnızca kullandığınız

başlıkları fonksiyonları mevcuttur açıklar. Başlıklar nadiren C dilinde gerçek kaynak kodu içerirler, genellikle sadece işlev ve tip tanımları içerirler. Derleyici, üstbilgideki bilgileri, işlevlerin sahip olduğu dönüş türlerini ve bağımsız değişken türlerini veya yapı veya birlikte hangi üyelerin olduğunu bilmek için kullanır. Kullanmakta olduğunuz işlevlerin tanımlarının gerçekte olduğundan emin olmanız linkerin görevidir. Bağlayıcı, kaynak kodunuzu önceden derlenmiş libglade kitaplığına bağlar ve her şeyi bağlar.

+0

olan/gladeui/gladeui-enum-types.c.template ve kayranın/gladeui/gladeui-enum-types.h.template oluşturmak için kullanılan gladeui-enum- detaylı olarak çalışmış olduğum types.c ve gladeui-enum-types.h. gladeui-enum-types.h glade_pointer_mode_get_type gibi birçok _get_type işlev tanımını içerir ancak glade_project_get_type için bir tane bulamıyorum. – Roger