Skocz do zawartości
ethanak

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

Pomocna odpowiedź

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?

 

Udostępnij ten post


Link to post
Share on other sites

Tak, dodatkowy preprocesor... Nawet się nie śmieję bo to mało śmieszne.

Udostępnij ten post


Link to post
Share on other sites

O tym z podlinkowanej strony.

Udostępnij ten post


Link to post
Share on other sites
(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

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...