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?
Ich denke, das nächste, was du bekommen wirst, ist das
%Vor%Es wird mit Literalen und Arrays kompiliert, aber nicht mit Zeigern.
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.