**OT: _P programovaci problem

Martin Horcicka horcicka at freebsd.cz
Thu Apr 25 15:01:13 CEST 2002


Ahoj,

Lukas Smiga (2002-04-25 14:25 +0200):

> Mam nasledujici problem: jsem C zelenac, hlavne co se tyce pokrocilych
> rysu jazyka a nerozumim nasledujicim konstrukcim s podtrzitkem.

identifikatory zacinajici podtrzitkem jsou funkcne zcela shodne s ostatnimi,
nicmene je zvykem jimi oznacovat jakesi "vnitrni" zalezitosti. Napriklad
standard jazyka C rezervuje vsechny identifikatory zacinajici sekvenci _X, kde
X je jakekoliv velke pismeno a mam dojem, ze i _, pro implementaci
standardnich systemovych knihoven.

> _exit - tohle vim, ze by snad mel byt rezervovany symbol exit pro sluzbu
> jadra/systemu

Neni to zadny rezervovany symbol - tak se proste z historickych duvodu jmenuje
sluzba jadra pro ukonceni procesu. Nevola se ale zpravidla primo, ale
prostrednictvim knihovni funkce exit, ktera provede nejake zaverecne akce
(napr. zavola funkce registrovane pomoci knihovni funkce atexit, zapise
buffery, ...) a pak zavola prave _exit. Viz _exit(2) a exit(3).

> <deklarace fukce> __P(...parametry...); - to uz mi nejde na rozum, opet
> tusim neco systemoveho

Odpovim definici tohoto makra ze souboru /usr/include/sys/cdefs.h:

#if defined(__STDC__) || defined(__cplusplus)

#define __P(protos)     protos          /* full-blown ANSI C */

#else   /* !(__STDC__ || __cplusplus) */

#define __P(protos)     ()              /* traditional C preprocessor */

#endif  /* !(__STDC__ || __cplusplus) */

Tedy za normalnich okolnosti - ve standardnim (ANSI/ISO) C - se makro __P
pouze rozvine do podoby sveho obsahu - tedy ponecha funkcim jejich prototypy
(- i s parametry). Ovsem pri prekladu historickymi implementacemi jazyka C,
ktere jeste neobsahovaly podporu funkcnich prototypu, proste deklarovane
parametry funkci odmaze. Toto makro se doporucuje pouzivat pouze pri upravach
starsiho kodu, ktery ma zustat kompatibilni se starsimi prekladaci.

> extern int ident_funkce LDAP_P((...parametry...)); - tohle je to hlavni
> o co mi jde, zvolil jsem konkretni priklad, protoze nevim, jestli je
> LDAP_P() mistni vychytavka, nebo obecna konstrukce. Cela deklarace
> funkce, ktera se exportuje vypada napr. takto:
>
> extern int	ldbm_back_initialize LDAP_P(( BackendInfo *bi ));

Tezko rict - muze to delat neco jako __P, ale stejne dobre take nemusi.
Nejlepsi bude dohledat si v hlavickovych souborech definici tohoto makra. ;-)

Martin




More information about the Users-l mailing list