Skocz do zawartości

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


ethanak

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?

 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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
Link do komentarza
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.

Link do komentarza
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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.