Stránka 1 z 1

C preprocesor - kontrola obsahu definic s proměnným počtem

Napsal: 12 pro 2016, 12:26
od Wolfik
Potřebuju v průběhu překladu odstřelit proces překládání pomocí direktivy #error, pokud určitá definice je nastavena na určitou hodnotu - problém je, že těch definic může být libovolný počet...
Všechny definice se liší jenom v jednom znaku a pomocí pevné definice znám jejich počet.

Radši příklad:

Kód: Vybrat vše

#define POCET_DEFINIC 3

#define DEFINICE0 TRUE
#define DEFINICE1 FALSE
#define DEFINICE2 TRUE
No a chtěl bych jakousi for smyčkou projet tyto definice a pokud některá je FALSE, tak ukončit překlad přes #error.
ZKouším googlovat a experimentovat, ale vypadá to, že to prostě nejde.

Pokud by někoho zajímalo pozadí toho všeho, tak se jedná hlavičkový soubor, co mi vyplivne systém hw, který má některé nastavení neimplementované nebo neotestované a já na to píšu malý framework (API) pro kolegy.

Prozatím mám tvrdou aserci, že krkolomně při spuštění programu si to načtu do proměnných obsah všech definic a tu otestuju...Takže to odstřelí aspoň běžící program :D

Napsal: 12 pro 2016, 22:42
od frpr666
Omlouvám se, ale nepochopil jsem důvod toho testování #define v cyklu.
Překlad C probíhá na jakém počítači a v jakém překladači?
Jak víme, preprocesor má omezený počet příkazů a cykly neobsahuje.
https://en.wikipedia.org/wiki/C_preprocessor

Klidně si můžeš napsat malý skript, který projede všechny .c (.h?) soubory projektu a udělá nějakou operaci, kterou si přeješ ještě před samotným překladem.

Napsal: 14 pro 2016, 01:17
od mtajovsky
Longin píše:... že krkolomně při spuštění programu si to načtu do proměnných obsah všech definic a tu otestuju...
To je snad zbytečné. Hodnoty lze testovat rovnou:

Kód: Vybrat vše

#define TRUE 1
#define FALSE 0

#define v1 FALSE
#define v2 TRUE
#define v3 FALSE

. . .

#if (v1 == TRUE) || (v2 == TRUE) || (v2 == TRUE)
#error "Some value was TRUE."
#else
   /* DO SOMETHIG USEFULL */
#endif
. . .
Pokud je některá z hodnot v1, v2, v2 TRUE, generuje se chyba.

Napsal: 14 pro 2016, 08:16
od Wolfik
mtajovsky

no a teď si představ, že mi bude z hw vygenerován hlavičkový soubor, kde je těhle číslovaných definic víc...
třeba stovky a já tam budu muset mít dlouhej preprocesorovej if.

Napsal: 14 pro 2016, 08:48
od rnbw
mtajovsky píše:

Kód: Vybrat vše

#if (v1 == TRUE) || (v2 == TRUE) || (v2 == TRUE)
                                     ^^ BUG
:D

Napsal: 14 pro 2016, 13:42
od mtajovsky
rnbw << na jakém překladači? Na Visual C++ je to OK. Chyba je tam sémantická, třetí testovaná hodnota má být v3. Na následujícím řádku je samozřejmě syntax error, vynucená direktivou #error, když je některá hodnota TRUE. Alternativně lze napsat i zkráceně:

Kód: Vybrat vše

#if v1 || v2 || v3 
#error "Some value was TRUE."
#endif
Longin << v tom případě bych do generace hlavičkového souboru rovnou zahrnul i generaci podmíněného překladu s tou direktivou #error a s testováním všech vygenerovaných #define's jestli je to možné. Jinak si napsat vlastní skript a vygenerovat z hlavičkového souboru samostatný modul s těmito testy.

Napsal: 14 pro 2016, 14:11
od Wolfik
jasné no...
dementní dotaz -co bys doporučil za skriptovací jazyk na tyto záležitosti?

Napsal: 14 pro 2016, 14:14
od rnbw
mtajovsky píše:rnbw << na jakém pøekladaèi? Na Visual C++ je to OK. Chyba je tam sémantická, tøetí testovaná hodnota má být v3.
Zozerie to asi kazdy prekladac, ale je to vyborna ukazka, preco to nie je dobre riesenie :)

BTW. Mozes to skusit napisat v jazyku Order: http://rosettacode.org/wiki/Order

Napsal: 14 pro 2016, 16:00
od mtajovsky
Longin << Perl nebo Python. Je to otázka osobních preferencí, já jsem dělal asi rok a půl skripty v Perlu, tak bych volil ten. Na textové extrakce byl vlastně stavěný původně - Practical Extracting and Reporting Language.