#define D1 "02.02.2017"
prinf ("Datum %s\n",D1);
Tento kod bez problemu funguje a print vytisken datum 02.02.2017
Ot8azkou je jak dosahnout tehoz pokud je define bez uvozovek?
#define D2 03.02.2017
Otazkou spis je, k cemu ze ti to vlastne ma byt?
Kazdopadne zatim me nenapadlo nic, co by fungovalo. Leda tak:
#define D3(x) #x
//...
printf("%s\n", D3(12.1.1999));
Ale nevidim v tom zadny smysl.
EDIT:
tak po otevreni manualu preprocesoru precijen nejake zpusoby jsou:
#define D2 12.1.1999
#define XSTR(x) STR(x)
#define STR(x) #x
#define D2_STR XSTR(D2)
int main()
{
printf("%s\n", D2_STR);
}
#2 KIIV
Děkuji.
K čemu je to dobré?Mám ARM jádro v FPGA , kod je pro něj,.spousta parametru do programu je předavána v hlavičkovém souboru, který před překladem vygeneruje jiny program podle aktualniho stavu systemu nebo zařizenim na kterém to pak cele jede. Hlavičkový soubor je poměrně rozsáhlý a vlastně určuje jak , z čeho a s jakými daty se přeloží vysledny program. Program, generující onen hlavičkovy soubor jsem dokonce psal ja v roce 2015, bohužel jsem u par #define zapomněl generovat "" typicky u toho datumu , ktere je retezcem i kdyz vypada jako cislo :-) Původně tam tyto #define byly jen kvůli čitelnosti a přehlednosti, nicméně ted jsme jich pár potřebovat kvůli přehlednosti dostat i do samotného přeloženého kodu a narazil an problem na který jsem se ptal.
Možna by šlo upravit program generjici hlabičkovy soubor, ale v mezičase ho začali použíbat kolegové na jine věci jako například k předávání parametru do matlabu a změna struktury hlavičkového souboru by mohla být problem a chcui se ji raději vyhnout
#2 KIIV
Prozdadíte , kde se takove věci daji nastudovat?
Uz 10 minut se snažim nanjit manual v kterém by byly jednotlivé makra trochu podobněji rozpitvána a jediné co jsme našel je https://gcc.gnu.org/….1.0/cpp.pdf
kde je to uvedeno jako příklad, ale co které makro děla a proč to děla už ne a tak jsme znaten.
#4 hans
To je presne ono, sekce Stringification.
Ja jsem zkousel puvodne:
#define D2 12.1.1999
#define STR(x) #x
printf("%s\n", STR(D2)); // vytisklo: D2
Pak az jsem se na to mrkl a pouzil to druhe makro: XSTR(x) STR(x)
No a co to dela? # udela z parametru makra retezec (ale ne z jineho makra). Problem je, ze parametr makra se bere tak jak je.
Napriklad SQR(X) X*X -> SQR(1-8) se nahradi za: 1-8*1-8
A v XSTR se to zda se nahradi vsechno. Mozna je to tam i nekde vysvetlene v sekci 3.3 Macro Arguments
To jsme našli to same, mě jen přišlo, že jde jen o příklad složeného viceurovnového makra a někde najdu manual s popisem jednotlivých častí . jak to funguje v tomto případě mi z příkladu došlo,ale že bych to uměl použít jink poskládné a zcela pochopil to tak uplně ne.
Jsme občas natvredlý a bez podroběnšjho popisu s příkldy se neobejdu :-)
robl=ém mám hlavně s preprocesorem, například jsme zatím nevypatral zda se dá nějak změnit format datupu kompilace vracenoho __DATE: z Feb 3 2017 na evropsky 3 Feb 2017
#6 Hans
Co se tyce __date__ ve vlastnim formatu, tak bych si to radsi vygeneroval v Makefile a pak to podsoupl jako definici makra pro prekladac.
Neco jako:
gcc -D "D2_STR=\"`date --iso-8601=seconds`\"" test.c # -> "2017-02-03T17:15:17+0100"
gcc -D "D2_STR=\"`date --iso-8601`\"" test.c # -> "2017-02-03"
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku