2016-09-27 7 views
-3

In C, ich habe zwei MakrosString-Verkettung in Makro C

Edit: 

#define macro1(name , number , date){\ 
<---------body------> 
} 


#define macro2(key){\ 
<------body-----> 
} 

Ich habe den Namen zu kombinieren (a char * Variable), Zahl (eine ganze Zahl), Datum (eine andere char* Variable) und senden Sie es als eine Zeichenfolge an die macro2, die von der macro1 aufgerufen werden wird.

Ich versuche es zu tun, indem Sie eine char * Variable in Makro 1 deklarieren und snprintf verwenden. Ist das eine gute Idee?

P.S: Ich konvertiere das in eine Zeichenfolge und kombiniere sie dann.

+4

was "def"? – Nick

+1

Dies ist nicht C. oder C++. Bitte verwenden Sie echten Code und richtige Tagging, da Tags die Leute sind, die Ihnen helfen können, Ihre Frage zu finden. – unwind

+0

Was ist "Bearbeiten:" ?? –

Antwort

1

Funktion in C++:

std::string concat(const std::string& name, int number, const std::string& date) 
{ 
    return name + std::to_string(number) + date; 
} 

Makro für Literale c-strings:

#define MACRO(name, number, date) name #number date 
+1

Wie funktioniert dieses Makro für Nicht-Inline-Strings? – Nick

+1

Funktioniert das für char * Strings? – Novice

+0

@Nick: Für nicht literale C-Strings ist die Verwendung der Funktion besser, da MACRO eine Verbesserung gegenüber der regulären Funktion bietet.(und sogar für das Literal würde ich Funktion verwenden). – Jarod42

0

Wenn Sie dies tun mit Makros, wird es zu groß und chaotisch.

Anstelle von Makros können Sie dies mit der Inline-Funktion tun. Das ist mehr C++ Art und Weise, aber es wird in C große Arbeit zu:

inline const char *macro1(const char *name, int const number, const char *date, char *buffer, size_t const buffer_size){ 
    // copy everything into the buffer, probably with sprintf() 
    return buffer; 
} 

bei C, I auch Funktion als definiert werden:

static inline const char *macro1(const char *name, int const number, const char *date, char *buffer, size_t buffer_size); 

aber dies wird nicht immer kompiliert in C++.

Update:

Wie 5gon12eder erwähnt, tut es compiliert auf gcc 6.2.1 und 3.8.1 Klirren.

Für C++ statt static Sie den anonymen Namespace verwenden:

namespace{ 
    inline const char *macro1(const char *name, int const number, const char *date, char *buffer, size_t buffer_size); 
} 

Schließlich, wenn Sie nur die Zeichenfolge verwenden möchten, es zu drucken oder in einer Datei speichern, verketten nicht, sondern nur das tun, es in dieser Funktion.

+0

Warum nur in C statisch? Oder meintest du, dass stattdessen ein anonymer 'Namespace' in C++ verwendet werden sollte? Außerdem sieht der "C++ Weg" für mich im Vergleich zu Jarod42s Lösung nicht sehr C++ aus. – 5gon12eder

+0

@ 5gon12eder - beide "static inline" wird nicht auf C++ kompilieren. Ich habe mich entschieden, nicht für anonymen Namensraum zu erwähnen. Ich glaube, er benutzt das für die Schule und natürlich lernen sie C, indem sie es C++ nennen. – Nick

+0

Ich bin mir nicht bewusst, dass 'static inline' in C++ nicht erlaubt ist. Ihre Vermutung über C und C++ in der Schule könnte jedoch stimmen. – 5gon12eder

0
#define STR1 "wel " 

#define STR2 "come" 

#define STR3 STR1 ## STR2 

ODER

#define STR1 "wel " 

#define STR2 "come" 

#define STR3 STR1 STR2