SORU
23 Aralık 2008, Salı


C ad

Bir şekilde, (ab)C ön işlemci C ad taklit var mı acaba?

Bu satırlar boyunca bir şey düşünüyorum:

#define NAMESPACE name_of_ns
some_function() {
    some_other_function();
}

Bu tercüme getirir:

name_of_ns_some_function() {
    name_of_ns_some_other_function();
}

CEVAP
23 Aralık 2008, Salı


Başka bir alternatif tüm fonksiyonlarını tutmak için bir yapı ilan etmek olurdu, ve daha sonra statik olarak işlevlerini tanımlayın. O zaman sadece genel ad yapı için isim çakışmaları hakkında endişelenmenize gerek.

// foo.h
#ifndef FOO_H
#define FOO_H
typedef struct { 
  int (* const bar)(int, char *);
  void (* const baz)(void);
} namespace_struct;
extern namespace_struct const foo;
#endif // FOO_H

// foo.c
#include "foo.h"
static int my_bar(int a, char * s) { /* ... */ }
static void my_baz(void) { /* ... */ }
namespace_struct const foo = { my_bar, my_baz }

// main.c
#include <stdio.h>
#include "foo.h"
int main(void) {
  foo.baz();
  printf("%d", foo.bar(3, "hello"));
  return 0;
}

Yukarıdaki örnekte, my_bar my_baz doğrudan ana çağrılabilir.c, sadece foo.

Eğer aynı imza ile fonksiyonları bu ad bir grup varsa, o zaman standardize edebilirsiniz senin ad ayarlamak için yapı ve zamanında kullanmak için bir ad seçin.

// goo.h
#ifndef GOO_H
#define GOO_H
#include "foo.h"
extern namespace_struct const goo;
#endif // GOO_H

// goo.c
#include "goo.h"
static int my_bar(int a, char * s) { /* ... */ }
static void my_baz(void) { /* ... */ }
namespace_struct const goo = { my_bar, my_baz };

// other_main.c
#include <stdio.h>
#include "foo.h"
#include "goo.h"
int main(int argc, char** argv) {
  namespace_struct const * const xoo = (argc > 1 ? foo : goo);
  xoo->baz();
  printf("%d", xoo->bar(3, "hello"));
  return 0;
}

my_bar my_baz birden çok tanımları, statik olarak tanımlanmış oldukları için çatışma yok, ama temel işlevleri hala uygun bir ad yapı ile erişilebilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jabari Johnson

    Jabari Johns

    18 Ocak 2008
  • Jared Busch

    Jared Busch

    25 Mayıs 2011
  • Ralph Phillips

    Ralph Philli

    5 Aralık 2006

İLGİLİ SORU / CEVAPLAR