C ++ 11 Funktion, die nur String-Literale akzeptiert?

8

Ich möchte eine C ++ 11-Funktion schreiben, die nur Zeichenfolgenliterale als Parameter akzeptiert:

%Vor%

Das ist:

%Vor%

Gibt es das überhaupt, um das zu implementieren? Die Signatur der Funktion ist offen für Änderungen, ebenso wie die Verwendung von Makros oder anderen Sprachfunktionen.

Wenn das nicht möglich ist, was ist die engste Annäherung? (Können benutzerdefinierte Literale irgendwie helfen?)

Wenn nicht, gibt es einen plattformspezifischen Weg in GCC 4.7 / Linux?

    
Andrew Tomazos 05.12.2012, 13:22
quelle

3 Antworten

12

Ich denke, das nächste, was du bekommen wirst, ist das

%Vor%

Es wird mit Literalen und Arrays kompiliert, aber nicht mit Zeigern.

    
Dirk Holsopple 05.12.2012, 13:34
quelle
3

Eine Alternative könnte darin bestehen, eine GCC-Erweiterung so einzurichten, dass sie zur Kompilierzeit überprüft, dass Ihre bestimmte Funktion nur mit einer literalen Zeichenfolge aufgerufen wird.

Sie könnten MELT verwenden, um GCC zu erweitern. MELT ist eine domänenspezifische High-Level-Sprache zur Erweiterung des GCC-Compilers und eignet sich sehr gut für die Art der gewünschten Überprüfung.

Im Grunde würden Sie einen neuen Pass innerhalb von GCC und Code hinzufügen, der in MELT übergeben würde, der jedes gimple finden würde, das ein Aufruf Ihrer Funktion ist, und prüfen, ob das Argument tatsächlich eine literale Zeichenfolge ist. Das Beispiel ex06 auf schmelzbeispielen sollte Sie inspirieren. Dann abonniere [email protected] und stelle dort deine MELT-spezifischen Fragen.

Natürlich ist dies kein idiotensicherer Ansatz: Die Funktion könnte indirekt durch Zeiger aufgerufen werden, und sie könnte z.B. eine teilweise wörtliche Zeichenfolge, z.B. f("hello world I am here"+(i%4)) ist konzeptionell ein Aufruf mit einer literalen Zeichenfolge (z. B. in .rodata segment), aber weder im generierten Code noch im gimple.

    
Basile Starynkevitch 05.12.2012 14:08
quelle
1

Ich benutze das:

%Vor%

Dann deklarieren Sie einfach Ihre Funktion wie folgt:

%Vor%

Und du nennst es so:

%Vor%

Wenn Sie so etwas tun:

%Vor%

Sie erhalten einen Compilerfehler.

    
Max 28.11.2017 13:54
quelle

Tags und Links