Chcę dołączyć literał łańcuchowy i literał literowy. Jako niepoprawny składniowo, "abc" 'd' "efg"
powoduje błąd kompilatora:Konkatenuj ciąg literału z literałem znaków
x.c:4:24: error: expected ',' or ';' before 'd'
Teraz muszę używać snprift (niepotrzebnie), pomimo wartości ciąg dosłownym i char dosłownym istoty wiedzą w czasie kompilacji.
Próbowałem
#define CONCAT(S,C) ({ \
static const char *_r = { (S), (C) }; \
_r; \
})
ale to nie działa, ponieważ null terminator S
nie jest usuwany. (Oprócz dawania ostrzeżenia kompilatora).
Czy istnieje sposób, aby napisać makro do korzystania
"abc" MACRO('d') "efg"
lubMACRO1(MACRO2("abc", 'd'), "efg")
lubMACRO("abc", 'd', "efg")
?
Na wypadek, gdyby ktoś zapytał, dlaczego tego chcę: literał literowy pochodzi z biblioteki i muszę wydrukować ciąg znaków jako komunikat stanu.
ja nie chcę * chcesz * Zastosowanie sprintf lub jakiekolwiek funkcje starcie. Proszę nie umieszczać żadnych odpowiedzi, które wykorzystują wywołania metod wykonawczych. – kay
Jeśli literał pochodzi z biblioteki, w jaki sposób uzyskujesz do niego dostęp? Czy jest to makro dostarczone przez plik nagłówkowy biblioteki? –
Tak, pochodzi z pliku nagłówkowego. – kay