Skocz do zawartości

GCC - zagwozdka z makrami (czy to w ogóle się da?)


Pomocna odpowiedź

Napisano

Hej!

Właśnie się natknąłem na taki głupi problem i... a co tu dużo mówić, opiszę.

Jest sobie jakaś makrodefinicja, powiedzmy:

#define ILOSC 16

Jest sobie literał w stylu:

const char PROGMEM napis[]="Wpisz liczbę od zera do " STRINGIFY(ILOSC-1);

Pytanie: jak skonstruować makro STRINGIFY aby zwróciło w tym przypadku "15"?

Najprostsza definicja:

#define STRINGIFY(x) #x

tworzy napis "Wpisz liczbę od zera do ILOSC-1"

Trochę bardziej skomplikowany (z dokumentacji GCC):

#define STRINGIFY1(x) #x
#define STRINGIFY(x) STRINGIFY1(x)

daje w efekcie:

"Wpisz liczbę od zera do 16-1"

Pytanie: jest taka możliwość żeby otrzymać string "Wpisz liczbę od zera do 15"?

Przypominam, że to ma być literał (czyli wszelkie zabawy z itoa czy sprintf odpadają). Nie interesują mnie inne kompilatory poza GCC.

Na razie zrobiłem protezę w stylu:

#define STRINGIFY1(x) #x
#define STRINGIFY(x) STRINGIFY1(x)
#define MAKSIMUM 15
#define ILOSC (MAKSIMUM+1)

const char PROGMEM napis[] = "Wpisz liczbę od zera do " STRINGIFY(MAKSIMUM);

ale strasznie mi się nie podoba, fujasta jakaś taka 😞

@Elvis Ty się najlepiej znasz na C, powiedz czego nie wiem?

 

(edytowany)

To nie jest preprocesor, tylko pliki nagłówkowe, które wykorzystują możliwości preprocesorów standardu C99, bo domyślam się, że z takiego właśnie korzystasz. Zresztą dla C11 też powinno działać.

Wchodzisz na stronę https://gitlab.inria.fr/gustedt/p99/.

Ściągasz folder o nazwie p99 (oczywiście z zawartością).

#include "ścieżka_do_folderu_p99/p99_logical.h"

#define STRINGIFY1(x) #x
#define STRINGIFY(x) STRINGIFY1(x)

#define ILOSC 16

const char PROGMEM napis[]="Wpisz liczbę od zera do " STRINGIFY(P99_MINUS(ILOSC,1));

 

Edytowano przez andrews
  • Lubię! 1
  • Pomogłeś! 1

A przepraszam - jak już ktoś w tym wątku zauważył fatalnie się czyta na telefonie 🙂

Działa ładnie - co prawda czegoś tak pokiełbaszonego dawno nie widziałem, ale jak wiadomo C słynie z doskonałej czytelności.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...