2010-02-05 13 views
5

Ich hatte die Kernighan- und Ritchie C-Referenz seit Jahren nicht mehr, aber ich erinnere mich, dass da eine Seite drin war, die darüber sprach, wie man Charaktere eingibt, die für dich nicht verfügbar waren. (Weg zurück in dem Tag, fehlten einige Tastaturen Zeichen wie“, ~, etc.)Was ist die alternative Zeichenkombination für die doppelte Anführungszeichen in C/C++?

Um klar zu sein, lassen Sie mich ein Beispiel geben. Ich bin nicht Suche nach einem Weg Anführungszeichen in Strings zu erhalten , sondern ich will diese ersetzen:

printf("foo"); 

mit diesem:

printf([alternate sequence]foo[alternate sequence]); 

Für die neugierigen, ich habe einen automatisierten Prozess, der C/C++ Code umfasst die Bildung, aber die (geschlossene Quelle) kommerzielles Werkzeug involvierte Streifen zitiert in seinen Datenströmen und die Dokumentation ist ziemlich klar auf der Tatsache, dass sie keine Möglichkeit bieten, ihnen zu entkommen.

EDIT:

Wow, ich hatte nicht eine so schwere Reaktion erwartet. Dies könnte ein wenig mehr Details zu meinem Prozess wert sein. Ich mache automatisierte Build-Systeme, was bedeutet, dass ich mit gewissen Einschränkungen lebe, wenn es darum geht, den Code zu ändern, den ich kompiliere. Fürs Erste müssen wir mit der Annahme leben, dass ich eine Zeichenfolge, Leerzeichen und alles, in eine Präprozessordefinition bringen muss. Ich bin schon runter gegangen 'PreprocessorDefinition' road. Dies ließ mich mit meinem üblichen Rückfall: die Zeichenfolge in der Betriebsumgebung definieren und die Projektdatei die Definition von dort eingestellt:

Preprocessor Definitions  WIN32;_DEBUG;THINGIE=$(THINGIE) 

Die Hoffnung war, dass ich um MSVC der Strippen von Zitaten in etwas überreichen die bekommen könnte bauen mit/D einen trigraph verwenden, indem sie in meiner Build Automation Skript so etwas wie dies zu tun:

ENV['THINGIE'] = "??''Yodeling Monkey Nuggets??''" 
run_msbuild_command 

ich denke, es ist Zeit für einen Plan C.

+0

Können Sie die Ausgabe des Programms weiter verarbeiten? Wenn Sie das tun können, können Sie einige seltene Zeichenfolgen für '" 'deklarieren und die Ausgabe dieses Programms an' sed' übergeben, was Ihre doppelten Anführungszeichen zurückgibt. –

+0

Zeit, darüber nachzudenken, einen Header zu erzeugen, der die Anführungszeichen enthält, und dann einschließlich der, wo Sie die Pre-Prozessor-Definition benötigen –

Antwort

10

Sie suchen ein trigraph für " Charakter ist? Ich glaube nicht, dass es einen gibt.

Trigraphs sind nicht für alle Zeichen vorhanden. Nur wenige Zeichen haben Trigraph-Sequenzen.

+3

Pro 2,3 Trigraph-Sequenzen und 2,5 Alternative Tokens, ein Ersatz für Doppel-Zitat existiert definitiv nicht –

+0

Trigraph war das Wort, nach dem ich war .. Habe nicht gehört, dass man in etwa ein Jahrzehnt. Danke. – Sniggerfardimungus

3

Ich denke, Sie sprechen über trigraphs. Soweit ich gelesen habe, ist es nicht eine für den „Charakter.

4

Sie von trigraphs

Character Trigraph 
[   ??(
\   ??/ 
]   ??) 
^   ??' 
{   ??< 
|   ??! 
}   ??> 
~   ??- 
#   ??= 

aber denken“ auf der Liste

8

Keine gemäß der Norm ist nicht. Versuchen Sie mit einem Header mit einem Makro:

#define QUOTE(x) #x 

und erzeugen ein printf wie:

printf(QUOTE(hello)); 
+0

Wie würde das helfen, wenn die Zitate entfernt werden? –

+2

Sie meinen QUTOE (Hallo). +1 – Notinlist

+4

Meinst du '#define QUOTE (x) # x'? AFAIK, Ihre aktuellen Makro-Ausgänge' "x "' string für alle Eingaben. –

0
aber die (geschlossene Quelle) kommerzielles Werkzeug beteiligt Streifen zitiert in seiner Datenströme und die Dokumentation ist ganz klar auf die Tatsache, dass sie keinen Weg bieten, ihnen zu entkommen.

Klingt wie ein beschissenes Werkzeug.

Es sieht hässlich aus, aber man könnte so etwas wie dies versucht:

static const char foo[] = {'H', 'e', 'l', 'l', 'o', 0}; 

printf(foo); 

Ich mag auch dirkgently Vorschlag # in einem Makro zu verwenden, aber ich frage mich, wie das mit Leerzeichen tun würde?

+0

Besser: 'const char foo []' – mark4o

+0

@mark: warum ist das besser? –

+0

@ mark4o - Sicher. Ich hatte ursprünglich 'static const char foo []' (wie ich gesehen habe einige Compiler erzeugen Code, der tatsächlich ein großes Array auf den Stapel ohne die 'statische 'in solchen Fällen, auch wenn' const ') kopieren, aber ich dachte es würde die eigentliche Idee ablenken - und dass es zu pikanten Kommentaren führen könnte, also habe ich es weggelassen. – asveikau

-1

Was denken Sie über die Verwendung von ´ anstelle von '?

Ich konfrontiert das gleiche Problem und versuchte es zu vermeiden, indem Sie den Textbegrenzer durch etwas harmloses ersetzen.