2016-10-21 2 views
3

из кода ядра LinuxМесто #define в структуре

struct gpio_desc { 
    struct gpio_chip *chip; 
    unsigned long  flags; 
/* flag symbols are bit numbers */ 
#define FLAG_REQUESTED 0 
#define FLAG_IS_OUT 1 
#define FLAG_EXPORT 2 /* protected by sysfs_lock */ 
#define FLAG_SYSFS 3 /* exported via /sys/class/gpio/control */ 
#define FLAG_ACTIVE_LOW 6 /* value has active low */ 
#define FLAG_OPEN_DRAIN 7 /* Gpio is open drain type */ 
#define FLAG_OPEN_SOURCE 8 /* Gpio is open source type */ 
#define FLAG_USED_AS_IRQ 9 /* GPIO is connected to an IRQ */ 
#define FLAG_IS_HOGGED 11 /* GPIO is hogged */ 

    /* Connection label */ 
    const char  *label; 
    /* Name of the GPIO */ 
    const char  *name; 
}; 

что причина место определяет в тело структуры?

+1

Что не так с этим? Может быть, константы близки к тому, где они используются. – Olaf

+1

Это нормально, я думаю, когда структура имеет только одно поле, которое нуждается в '# define'. Похоже, что определение структуры было бы бесполезным, если бы у вас было полдюжины полей, каждый из которых определял 10. – user3386109

ответ

5

С #define неважно, куда вы их помещаете (до тех пор, пока он находится выше в файле, чем там, где он впервые используется). Скорее всего, эти константы используются только внутри этой структуры, поэтому они были установлены так логически, что их было бы легче найти. Их можно было положить куда-то выше первого места, где они использовались, но они были сгруппированы вместе из-за сходной цели.

+3

Я предполагаю, что это просто sel-document поле 'flags'. –

2

Это бессмысленно, кроме как попытаться определить их близко к точке первого использования.

К тому времени, когда компилятор действительно увидит код, препроцессор лишит эти строки из него.

В этом конкретном примере им было бы лучше с перечислением typedef'd для флагов и с использованием этого перечисления, чтобы объявить поле.

+1

'# define' часто предпочтительнее над' enum'. Например, когда числовое значение используется для какого-то вычисления. –

+0

Только если эти вычисления указаны в директивах препроцессора. Всюду еще enum преобразует тихо к int (в C). – kdopen

+1

Не тихо. Вы получите предупреждения о том, что тип «enum» смешан с другим типом. –

0

Не оказывает никакого воздействия. Но в этом примере для удобства чтения они поддерживаются/добавляются рядом с объявленной переменной.

Они хотят использовать эти «#define» для переменной «unsigned long flags;».

Ниже приведен простой пример и не оказывает никакого влияния на класс/структуру, объявляя «#Define» внутри.

//gcc 4.9.3 

#include <stdio.h> 

struct gpio_desc { 

#define FLAG_REQUESTED 0 

} test; 

int main() 
{ 
    printf("%d",FLAG_REQUESTED); 
} 

Исходный пункт равен нулю.

+1

Это вопрос о C, а не C++. В вашем примере используется заголовок C++ и создается пустая структура, которая не допускается в C (хотя она действительна для создания пустого класса в C++), и использует C++ I/O. Все это добавляет несоответствующий ответ на вопрос C. –

+0

Изменен код – Naidu

+0

@Jonathan Вышеприведенный код разрешен в gcc 4.9.3. Я имею в виду пустую структуру. Попробуйте здесь http://rextester.com/l/c_online_compiler_gcc – Naidu

Смежные вопросы