SORU
10 Temmuz 2014, PERŞEMBE


C -- bu yapı/yapmak ne demek?boş

Bu kullanmam gereken bir aygıt için bir başlık dosyası kod buldum ve yıllardır C yapıyorum ama asla Ben:

struct device {
};

struct spi_device {
    struct device dev;
};

ve olarak kullanılır:

int spi_write_then_read(struct spi_device *spi, 
const unsigned char *txbuf, unsigned n_tx,
unsigned char *rxbuf, unsigned n_rx);

ve de burada:

struct spi_device *spi = phy->spi;

aynı şekilde tanımlandığı.

Bu tanım ile ne olduğundan emin değilim. Kurulu bir linux uygulaması için bir başlık dosyası içinde, karşısında şaşkın. Herhangi bir açıklama, bir fikir var mı? Herkes bundan önce bazılarınız eminim:) hiç görmedim.

Teşekkürler! bp:

CEVAP
10 Temmuz 2014, PERŞEMBE


Bu C yapıları en az bir üyesi adlı içeriğine sahip olarak C değildir:

(C11, 6.7.2.1 Yapısı ve Birliği belirteçleri p8) "Eğer yapı-beyannamesi-liste içermiyor herhangi adında üyeleri, doğrudan ya da üzerinden anonim bir yapı ya da başarısız olduğunda, davranışı tanımsız."

ama GNU C uzantısı:

GCC C bir yapısı yok üyeler için izin verir:

struct empty {
};

Yapıya sahip boyutu sıfır

https://gcc.gnu.org/onlinedocs/gcc/Empty-Structures.html

Bu amacı örnek oluşturmak nedir bilmiyorum ama genel olarak yapısı bu tür ileri bir beyan olarak kullanılabilir bence.C hiçbir üyesi ile bir sınıf için izin verildiğini unutmayın.

Linux spin_lock_t türü Diğer çekirdek 2.4 tanımında koşullu derleme ile boş bir yapı türünün bir örneği var Linux 2.4 (/linux include/sayaç kilidi.h):

#if (DEBUG_SPINLOCKS < 1)

/* ... */

typedef struct { } spinlock_t;

#elif (DEBUG_SPINLOCKS < 2)

/* ... */

typedef struct {
    volatile unsigned long lock;
} spinlock_t;

#else /* (DEBUG_SPINLOCKS >= 2) */

/* ... */

typedef struct {
    volatile unsigned long lock;
    volatile unsigned int babble;
    const char *module;
} spinlock_t;

#endif

Amaç DEBUG_SPINLOCKS < 1 diye API işlevleri değiştirmek zorunda kalmadan bazı yer kazanmak için. Ayrıca kukla (sıfır boyutlu) nesne türü spinlock_t tanımlamanızı sağlar.

(Son) boş bir yapısının çekirdek koşullu derleme ile kullanılan hack Linux başka bir örnek/linux/aygıtı vardır.h:

struct acpi_dev_node {
#ifdef CONFIG_ACPI
    void *handle;
#endif
};

Kroah-Hartman, bu son örneğin burada Greg: tartışma bakın

https://lkml.org/lkml/2012/11/19/453

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 3DS Max Tutorials

    3DS Max Tuto

    4 AĞUSTOS 2013
  • Drakinen

    Drakinen

    1 EYLÜL 2008
  • The Bad Tutorials

    The Bad Tuto

    6 EKİM 2009