Portál AbcLinuxu, 9. května 2025 22:47

Dotaz: Jazyk C - makro do - while na globální úrovni

14.3.2012 01:19 Matěj Vaňátko | skóre: 19 | Brno
Jazyk C - makro do - while na globální úrovni
Přečteno: 429×
Odpovědět | Admin
Zdravím vás všechny. S jazykem C tak trochu začínám a potřeboval bych udělat makro do - while se 2 parametry. Makro mám udělané takto:

#define Jmeno_makra(x, y) \
do { \
příkazy v makru \
} while (0)


Jenže to funguje jen na lokální úrovni ve funkcích. Neporadili byste mi prosím nějakou vychytávku, abych tohle makro (nebo podobné) mohl rozvinout i na globální úrovni ?

V tuhle chvíli mi totiž překladač hází tyto 2 chyby
error: expected identifier or ‘(’ before ‘do’
error: expected identifier or ‘(’ before ‘while’

Děkuju moc za rady

Řešení dotazu:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

pavlix avatar 14.3.2012 01:39 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Jazyk C - makro do - while na globální úrovni
Odpovědět | | Sbalit | Link | Blokovat | Admin
Je potřeba vždy poslat celý chybný kód a ne jenom jeho část.

Na globální úrovni ti do…while nebude fungovat, tam se žádný kód nevolá, céčko není Python.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
14.3.2012 09:17 Matěj Vaňátko | skóre: 19 | Brno
Rozbalit Rozbalit vše Re: Jazyk C - makro do - while na globální úrovni
Python bohužel neznám, takže to neporovnám.
Mám v céčku napsaný toto makro:
#define BitArray(p, size) \
unsigned long p[(size)]; \
memset(p, 0, ((size) * sizeof(unsigned long))) \
p[0] = size;


To funguje na lokální úrovni ve funkcích naprosto skvěle. Potřebuji ale, aby to fungovalo i globálně. Aby to vytvořilo globální pole unsigned longů. Přiznám se, je to kousíček projektu do školy. Ale fakt už nevim, jak toto vyřešit, jinak už celý projekt hotov :-)
14.3.2012 09:45 Marble | skóre: 27 | blog: marble
Rozbalit Rozbalit vše Re: Jazyk C - makro do - while na globální úrovni

Pokud výrazem "globální úroven" myslíš mimo jakoukoliv funkci (včetně main), tak to není oblast, kde se vykonávají příkazy a tudíž tam nemůžeš ani volat fuknkce, přiřazovat atd.; vstupním bodem C programu je právě fukce main().

Nicméně pokud chápu, o co se snažíš, tak to memset je úplně zbytečný a přiřazení zajistí inicializace pole přímo v jeho deklaraci (viz třeba C FAQ list).

Ale pozor na to, že statické pole inicializované nenulovým obsahem ti patrně skončí v celé své délce ve výsledné binárce (pokud se nebude kompiler extra snažit optimalizovat, ale nevím jestli a za jakých podmínek to dělá, gcc standardně ne).

14.3.2012 10:39 Matěj Vaňátko | skóre: 19 | Brno
Rozbalit Rozbalit vše Re: Jazyk C - makro do - while na globální úrovni
Ano, globální úrovní myslím to, co popisuješ. Potřebuji, aby to makro dokázalo vytvořit jak lokální, tak globální pole o zadané délce. Když tu délku zadám pomocí #define... , tak to samozřejmě je v cajku a memset je tudíž zbytečný ;-) Ale v další části projektu tomu samému makru potřebuju předat tu velikost pole pomocí proměnné.

Tudíž otázka -> jde toto vlastně udělat ? Nebo se na to vykašlat a přepsat si pro další část toho projektu to makro do funkce ?
14.3.2012 11:27 Marble | skóre: 27 | blog: marble
Rozbalit Rozbalit vše Re: Jazyk C - makro do - while na globální úrovni
No, pokud to makro budeš používat pro deklaraci variable-length pole (což je mmch feature až C99, tedy ne úplně samozřejmě podporovaná věc), tak ti bude fungovat jen pokud bude přesně na konci deklarací proměnných. Ani v C99 se nedá prokládat deklarace a kod, na to potřebuješ C++.

S otázkou makro/funkce to prakticky vůbec nesouvisí. Tam, kde se neprovádí kod, nemůžeš ani volat svojí funkci. Naopak nevím, jak by chtěl ve funkci řešit deklaraci. Prostě v C se deklarace a (nestatická) inicializace proměnných nedá moc dobře spojit.

Jestli je možné "toto" udělat záleží na tom, co přesně je "toto". (Předpokládám, že nestojíš o ten konkrétní kus, co jsi tu poslal, ale o nějakou obecnější vlastnost.) Možná je nejjednodušší mírně přehodnotit použité metody s ohledem na vlastnosti C, ale to už musíš posoudit podle toho, čeho chceš dosáhnout.
pavlix avatar 15.3.2012 00:25 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Jazyk C - makro do - while na globální úrovni
To funguje na lokální úrovni ve funkcích naprosto skvěle.
Taky řídící konstrukce jako cykly se v céčku používají jen tam, kde můžeš napsat sekvenci příkazů. Tedy pouze ve funkcích. I kód, který obsluhuje globální proměnné se provádí ve funkcích. Tak je ten programovací jazyk stavěný.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
Řešení 1× (Fuky)
Josef Kufner avatar 15.3.2012 02:36 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Jazyk C - makro do - while na globální úrovni
Odpovědět | | Sbalit | Link | Blokovat | Admin
To o co se snažíš s největší pravděpodobností půjde mnohem snadněji, když to celé překopeš a začneš úplně odjinud. Btw, na co takovou obludnost potřebuješ?
Hello world ! Segmentation fault (core dumped)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.