Czy jest możliwe uzyskanie wartości symbolu #defined integer do dosłownego wstawienia w literał łańcuchowy, który jest częścią sekcji złożenia w GCC (AVR Studio)?C Makro - jak uzyskać wartość całkowitą w ciągu literowym
Chcę, aby "LEDS" zostały zastąpione przez 48 w ciągu literału wewnątrz bloku asm() poniżej.
#define LEDS 48 //I only want ONE mention of this number in the source
int x = LEDS; //I'm using the value directly too
void DrawFrame()
{
asm(
"ldi R27, 0x00 \n\t"
"ldi R26, 0x00 \n\t"
"ldi R18, LEDS \n\t" //<-- substitution needed here
...
}
ale chcę kompilatora/asembler (po preprocesor zrobił to zadanie), aby zobaczyć ten ...
#define LEDS 48 //I only want ONE mention of this number in the source
int x = LEDS; //I'm using the value directly too
void DrawFrame()
{
asm(
"ldi R27, 0x00 \n\t"
"ldi R26, 0x00 \n\t"
"ldi R18, 48 \n\t" //<-- substitution needed here
...
}
Do tej pory próbowałem wszystkie makro sztuczki mogę myśleć (#stringification, substytucja arg, a nawet #include pliki z różnymi kombinacjami wartości i podwójnych cudzysłowów i cokolwiek).
Nie jestem zaznajomiony z magią wprowadzania kodu zestawu AVR do kompilatora GCC AVR Studio.
Próbuję uniknąć wielu wystąpień literału "48" w moim źródle, jeśli preprocesor może wykonać to zastąpienie dla mnie, byłoby świetnie.
Edytuj: Jest to projekt oprogramowania układowego mikrokontrolera - i tylko po to, aby życie było interesujące, prawie nie ma wolnego miejsca na dodanie nowego kodu.
przyjrzeć [Umieszczenie dyrektywę preprocesora wewnątrz łańcucha dosłownym] (http://stackoverflow.com/q/14721007/ 2305521) – fpg1503
Dlaczego łańcuch i konkatenacja nie działają? –
@CodyGray, stringification nie "ocenia" tego, co przekazujesz, po prostu pobiera znaki z argumentu i zrzuca je bezpośrednio vrbatim, chyba że użyjesz dodatkowego makra do zastąpienia pożądanych znaków przed stringyfikacją. – Wossname