Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Linux Kernel Space kennt kein typedef struct?



nobody0
10-07-2005, 23:56
Mit Code, den ich im User-Space und auch auf Mikrocontrollern (freestandig) seit längerem verwende, mußte ich leider feststellen, daß ihn nur dann in ein Modul integrieren kann, wenn ich kein typedef struct verwende (weil das "error: syntax error before '*' token" gibt), indem ich entsprechend kapsele:



# ifndef __KERNEL__
typedef struct
# else
struct Clock
# endif // __KERNEL__
{
u16 u16_yday; // 1..366 days since 1.1. +1, redundant
u8 uc_second; // 0..61 (ink. leap seconds)
u8 uc_minute; // 0..59
u8 uc_hour; // 0..23
u8 uc_day; // 1..31
u8 uc_day_of_week; // 1..7, redundant
u8 uc_month; // 1..12
u8 uc_kweek; // 1..53, redundant
u8 uc_year; // 0..68, with Offset 2000
u8 uc_moonphase; // 0..29, redundant
s8 sc_timezone; // offset to UTC in hours
_Bool b_summertime; // true, false; for localtime_has_summertime
}
# ifndef __KERNEL__
T_s_clock;
# else
;
# endif // __KERNEL__

# ifdef __KERNEL__
# define T_s_clock struct Clock
# endif // __KERNEL__


Das funktioniert zwar, ist aber lästig und bläht den Code auf.
Gibt's denn keinen Trick mit dem man auch im Kernel Space ein typedef struct verwenden kann? :confused:

anda_skoa
11-07-2005, 09:32
Warum brauchst du das typedef?

Gibt es Compiler die einer Struktur keinen direkten Namen geben können?

Ciao,
_

nobody0
11-07-2005, 09:37
Ich kann auch ohne Typedef leben, aber es ist ANSI-C und man muß bei der Anwendung dadurch nicht immer struct dazu tippen. Häufig ist ja egal ob es sich bei einem Objekt um eine Struktur handelt oder etwas anderes, wenn man es nicht direkt sondern über aufgerufene Funktionen bearbeitet, so daß das struct umständlich ist.

anda_skoa
11-07-2005, 13:47
Hmm, ok, versteh ich als C++ Programmierer wahrscheinlich einfach nicht.

Für mich ist da der Unterschied nur zwei Namen vs. ein Name pro Datentyp.

Ciao,
_

almoeli
12-07-2005, 14:41
Hi,

also so ganz verstehe ich dein Problem auch noch nicht.
Im Kernel wird sehr häufig ein



typedef struct
{
...
} typname_t;


verwendet.
Und ich hatte auch noch nie ein Problem damit bei meinen eigenen Kernelsachen.
Ich denke mal dein Fehler liegt woanders. Vielleicht kannst du mal ein komplettes Beispiel (Header + kleinen Codesnipsel wo der Typ dann verwendet wird) posten.

Viele Grüsse

almoeli

nobody0
13-07-2005, 08:29
Also ich habe es nochmal getestet: Bei einem einfachen Kernel-Modul tritt der Fehler nicht auf!
Das Problem tritt bei einem RT-Modul mit Linux+RTAI auf.
Ich werde das mal auf der Mailingliste dort posten.