Re: Jak správnì rozdìlit C++ projekt

Ondrej ondrej-hwl na hawsys.cz
Sobota Září 11 15:52:44 CEST 2021


Stane se to v C i v C++ (podle mě preprocesor je pro oba jazyky zhruba 
stejný). Osobně jsem se s tím koneckonců několikrát setkal.


Jako příklad si vezměme  externí knihovnu, která v souboru 
"extLibErrCode.h" definuje

#define E_OK         666


A dále "náš soubor" test.c, který bude obsahovat

#include <extLibErrCode.h>


#define ALE_OK              (1<<5)  // bit in register


int ARE_OKAPI (Animal *a); //check if animal is okapi


po průchodu preprocesorem se z souboru test.c stane

#include <extLibErrCode.h>


#define AL666              (1<<5)  // bit in register


int AR666API (Animal *a); //check if animal is okapi


a následný překlad selže. Bohužel původní soubor extLibErrCode.h není 
náš a nemůžeme ho změnit.


Soubor test.c sice náš je, takže ho upravit můžeme (např. přidáním 
#undef E_OK) nicméně to není čisté řešení.


V rámci C nastane podobný problém, pokud dvě entity definují stejnou 
globální proměnnou (třeba int last_error_code;). V C++ jde problém 
obejít tím, že vše se umístí do vhodného namespace. Jenomže preprocesor 
jde na řadu jako první a namespace ho naprosto nezajímají.


Ještě bych dodal, že to co jsem psal nezvýší velikost kódu nebo 
proměnných o jediný byte. Optimalizace je koneckonců stejná pro CPU s 8 
jako 800 MHz. Ono totiž když máte 800 Mhz tak tam toho většinou běží 
více nebo je úloha tak náročná, že plýtvat výkonem stejně nejde. Nehledě 
na to, že dělat optimalizaci předtím, než kód vůbec někde běží a můžeme 
si změřit, kde je "bottleneck" je cesta do pekel. Ono stejně v 99% 
případů buď optimalizace není potřeba nebo je nejlepší ji nechat na 
kompilátoru. A to 1% je buď něco jako kódování videa, na co se stejně 
použije externí knihovna nebo hodně specifický případ.


Ondřej



Dne 24.8.2021 v 0:57 Pavel Hudecek napsal(a):
>
> Já to teď vyzkoušel v C i C++ a teda nic takovýho se nedělo.
>
> PH
>
> *Od: *Jan Waclawek <mailto:konfera na efton.sk>
>
> > * #define - [...]
>
> > Pokud napø.
>
> > definujete makro ERROR na 1 a nìkdo použije funkci se jménem 
> PRINT_ERROR
>
> > tak vaše makro jí zmìní na PRINT_1 (nehledì na namespace).
>
> Takto to funguje v C++?
>
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20210911/a01a2826/attachment.html>


Další informace o konferenci Hw-list