Erste-Ebene-Makro-Erweiterung anordnen C

8

Ist es möglich, dieses C-Makro zu stringieren:

%Vor%

mit etwas wie

%Vor%

um

zu erhalten

"(GPIO_PORT_D|GPIO_PIN_IRQ_RISING|GPIO_PIN5)" ?

    
Heeryu 23.01.2014, 13:42
quelle

2 Antworten

4

Ja, das ist möglich. Weitere Informationen zur Stringifizierung finden Sie in GCC cpp documentation.

%Vor%

Ich korrigierte meine Antwort dank Wojtek Surowkas

Verwenden Sie dann MY_STRINGIFY(GPIO_PORT_D|GPIO_PIN_IRQ_RISING|GPIO_PIN5) , was viel besser funktioniert, wenn Sie ein enum verwenden, um die Konstanten zu definieren, z. B.

%Vor%

Natürlich funktioniert das nicht so, wie Sie wollen, wenn Sie GPIO_PORT_D als Makro benötigen, z. weil es zu einem nicht konstanten literalen Ausdruck erweitert wird (wie eine Variable oder ein Zugriff auf ein Feld einer globalen Struktur usw.).

Als Gegenbeispiel:

%Vor%

wird auf "1|2" nicht auf "FOO|BAR" erweitert, wenn Sie die beiden #define -s für FOO und für BAR entfernen und sie durch

ersetzen %Vor%

Sie erhalten wirklich die Erweiterung "FOO|BAR" , wie Sie wollen. Überprüfen Sie mit gcc -C -E ...

Auch:

%Vor%

wird als "(FOO|BAR)" erweitert. Wenn Sie jedoch #define für FOO und für BAR verwenden, erhalten Sie die Erweiterung "(1|2)" .

Vielleicht könnten Sie Ihre eigene Kopfzeile hinzufügen, nachdem Sie die externe Kopfzeile, die GPIO_PORT_D etc ... definiert, als literale Konstanten hinzufügen, etwa wie folgt:

%Vor%

und dann erhalten Sie mehr lesbare stringifizierte Konstanten (aber nicht genau das, wovon Sie träumen).

    
Basile Starynkevitch 23.01.2014, 13:47
quelle
3

Wenn Sie solche zwei Definitionen haben

%Vor%

MY_STRINGIFY tut was Sie wollen - erweitert sein Argument und fügt Anführungszeichen nach.

    
Wojtek Surowka 23.01.2014 13:51
quelle