Überprüft den Typ der Zeichenfolge (z. B. Literal, Array, Zeiger), die an eine Funktion übergeben wird [duplizieren]

8

Ich habe eine Funktion, die ein Zeichen-Array und seine Größe annimmt:

%Vor%

Die Funktion wird von einem Makro wie folgt umschlossen:

%Vor%

Mein Problem ist, dass ich den Benutzer irgendwie verbieten oder informieren möchte, dass nur String-Literal an diese Funktion übergeben werden soll. Denn wenn ein Zeiger oder ein lokales Array in der Karte gespeichert wird, können sie den Gültigkeitsbereich verlassen und eine Verwüstung verursachen!

Gibt es einen Kompilierzeit-Weg (bevorzugt) oder zumindest einen Laufzeit-Weg?

    
HiddenAngel 28.04.2011, 13:15
quelle

3 Antworten

26

Sie können die Kompilierzeit kennen, indem Sie einfach Ihr Makro in:

ändern %Vor%

Verwendung:

%Vor%     
iammilind 28.04.2011, 13:19
quelle
0

Dies funktioniert nicht, sizeof (char *) gibt die Größe des Zeigers zurück, nicht den zugewiesenen Speicher oder die Zeichenfolgengröße.

strlen (x) gibt die Größe eines Strings zurück, indem Sie nach dem '\ 0' suchen.

    
Hogan 28.04.2011 13:20
quelle
0

Wenn Sie eine Nicht-Makro-Lösung benötigen / wollen, gibt es einen Vorlagen-Trick, der Ihnen helfen kann. Sie können eine Funktionssignatur haben, die folgendermaßen aussieht:

%Vor%

Das erste Formular akzeptiert Zeichenfolgenliterale und ruft die Zielfunktion auf. Das zweite Formular verhindert, dass nicht konstante Zeichenfelder übergeben werden. Und ja, bieten Sie keine char const* Version an.

Dies garantiert nicht, dass die Zeichenfolge ein Zeichenfolgenliteral ist, aber die eine Syntax, die benötigt wird, um sie zu umgehen, ist extrem selten (ich habe sie nie benutzt).

Ansonsten ist die Makroversion von iammilind nett.

    
edA-qa mort-ora-y 28.04.2011 14:05
quelle

Tags und Links