LINUX.ORG.RU

[C, linux source] Зачем нужно писать #define SOMETHING SOMETHING ?


0

0

Файл [linux/kernel/git/torvalds/linux-2.6.git] / arch / x86 / include / asm / types.h (Ссылка)

#ifndef _ASM_X86_TYPES_H
#define _ASM_X86_TYPES_H

#define dma_addr_t      dma_addr_t

#include <asm-generic/types.h>

#ifdef __KERNEL__
#ifndef __ASSEMBLY__

typedef u64 dma64_addr_t;
#if defined(CONFIG_X86_64) || defined(CONFIG_HIGHMEM64G)
/* DMA addresses come in 32-bit and 64-bit flavours. */
typedef u64 dma_addr_t;
#else
typedef u32 dma_addr_t;
#endif

#endif /* __ASSEMBLY__ */
#endif /* __KERNEL__ */

#endif /* _ASM_X86_TYPES_H */

Вопрос: строка номер 4 лишняя, или это исползование недокументированных фич препроцессора?
Или это эквивалент к
#define dma_addr_t
?


нет, там элементарно может быть

#ifdef dma_addr_t
struct dma_addr_t addr;
#else
struct something_else_t addr;
#endif

P.S. types.h не смотрел

lester_dev ★★★★★
()
Ответ на: комментарий от aydar

>Думаешь, этот torvalds си знает хуже тебя?

Человек поинтересовался зачем. ТС, если не секрет, что пишете?

ShTH
()
Ответ на: комментарий от tailgunner

Я пытался размышлять логически.

Что делает эта строка?
#define dma_addr_t dma_addr_t

По законам препроцессора она находит лексему dma_addr_t и заменяет ее на лексему dma_addr_t. Тоесть, ничего нового не получится.

С другой стороны, если раньше было определено
#define dma_addr_t SOMETHING
то также ничего не произойдет, поскольку лексемы dma_addr_t уже кончились

И в учебниках не находил ничего по поводу такой конструкции....

Посмотрел asm-generic/types.h, теперь-то точно неясно, почему нельзя использовать просто #define dma_addr_t ? Там черным по белому написано

#ifndef dma_addr_t
#ifdef CONFIG_PHYS_ADDR_T_64BIT
typedef u64 dma_addr_t;
#else
typedef u32 dma_addr_t;
#endif /* CONFIG_PHYS_ADDR_T_64BIT */
#endif /* dma_addr_t */

----

единственная мысля - это такой крутой магический хак, который позволяет определить макрос, не определяя его Оо

Думаешь, этот torvalds си знает хуже тебя?

нет, не думаю ) я си вообще не знаю )

ТС, если не секрет, что пишете?

ничего, тоесть разглядываю код ядра линя с целью написать свою ось по его подобию

danbst
() автор топика
Ответ на: комментарий от danbst

Посмотрел asm-generic/types.h, теперь-то точно неясно, почему нельзя использовать просто #define dma_addr_t ? Там черным по белому написано

#ifndef dma_addr_t 
#ifdef CONFIG_PHYS_ADDR_T_64BIT 
typedef u64 dma_addr_t; 
#else 
typedef u32 dma_addr_t; 
#endif /* CONFIG_PHYS_ADDR_T_64BIT */ 
#endif /* dma_addr_t */

Если сделать по-твоему, то вышеприведенный блок расширится в:

typedef u32;

что является синтаксической ошибкой

разглядываю код ядра линя с целью написать свою ось по его подобию

Надеюсь, ты шутишь.

tailgunner ★★★★★
()
Ответ на: комментарий от danbst

>ничего, тоесть разглядываю код ядра линя с целью написать свою ось по его подобию

Автор Bolgenos или как его там, перелогиньтесь

lester_dev ★★★★★
()
Ответ на: комментарий от tailgunner

кстати да, спс за разьяснение. Ни удалить строку, ни заменить нельзя - повлечет за собой тяжелые изменения. Возьму на заметку этот трюк )

Надеюсь, ты шутишь.

К сожалению, нет :(

Автор Bolgenos или как его там, перелогиньтесь

вижу, безумцев кроме меня хватает на этом форуме =)

danbst
() автор топика

> Вопрос: строка номер 4 лишняя, или это исползование недокументированных фич препроцессора?

Это для того, чтобы отловить дальнешее переопределение вида #define dma_addr_t SOMETHING

Если такое переопределение случится, то тип dma_addr_t рискует, ВНЕЗАПНО, стать чем-то еще :-)

А с дефайном в 4-й строке мы получим матюгающийся компилер ;-)

namespace_std
()

http://lkml.indiana.edu/hypermail/linux/kernel/0903.3/03656.html

Это борьба за уменьшение кол-ва файлов, где определяется тип dma_addr_t. То есть предложено везде использовать #include <asm-generic/types.h>, а если на данной конкретной архитектуре хочется другой тип, сделать

#define dma_addr_t dma_addr_t

и потом сделать «typedef u64 dma_addr_t».

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.