Wenn Sie wirklich den Textbaustein loswerden wollen und Sie bereit sind, den Präprozessor zu benutzen, dann machen Sie einfach weiter und schreiben Sie das Muster auf. Das allgemeine Muster haben Sie sieht aus wie
extern "C" {
void C_accessible_declaration(); // this is all C sees
}
void Cxx_accessible_declaration_1(int);
void Cxx_accessible_declaration_1(long);
So könnte man einen Makro machen,
#ifdef __cplusplus
# define C_PORTABLE_FUNCTION_SET(C_DECLS, CXX_DECLS) \
extern "C" { C_DECLS } \
CXX_DECLS
#else
# define C_PORTABLE_FUNCTION_SET(C_DECLS, CXX_DECLS) \
C_DECLS
#endif
Dies funktioniert, weil eine normale Funktionsdeklaration kein Komma nicht eingeschlossen durch Klammern enthalten. Wenn Sie möchten, dass es mit Vorlagen arbeitet (mit kommagetrennten Vorlagenparametern), können Sie Variadic-Makros, die in C99, C++ 11 und verschiedenen Compilern vor diesen Standards unterstützt werden, als Erweiterung verwenden.
#ifdef __cplusplus
# define C_PORTABLE_FUNCTION_SET(C_DECLS, ...) \
extern "C" { C_DECLS } \
__VA_ARGS__
#else
# define C_PORTABLE_FUNCTION_SET(C_DECLS, ...) \
C_DECLS
#endif
Jetzt funktioniert dies so lange, wie die C-Erklärungen, keine nackten Kommas enthalten, das heißt, Sie sollten nicht mehr Objekte in der einer Erklärung erklären. Ich habe es C_PORTABLE_FUNCTION_SET
genannt, um zu betonen, dass es hauptsächlich sicher für die Verwendung mit Funktionsdeklarationen ist, aber beachten Sie, dass Sie C-zugängliche Objekte auch innerhalb von extern C
deklarieren müssen. Gemeinsame struct
Definitionen sollten überhaupt nicht geschützt werden; Sie sind durch das C++ - POD-Konzept geschützt und enthalten keine Sprachverbindungen.
Verbrauch:
#ifdef __cplusplus
template< typename T, typename U >
class Buffer { // still use #ifdef for the general case
...
};
#endif
C_PORTABLE_FUNCTION_SET (
void ArrayList_insert(ArrayList *arrlst, void *data, int i);
, /* C++ */
void ArrayList_insert(ArrayList *arrlst, char *data, int i);
template< typename T, typename U >
void ArrayList_insert(ArrayList *arrlst, Buffer< T, U > &data, int i);
)
Ich glaube nicht, dass ich das selbst tun würde, aber es scheint sicher genug idiomatische zu werden.
Dies wird einen Fehler verursachen, wenn mit c kompiliert wird, weil c keine Funktion überladen unterstützt. – chacham15
chacham15 - Sie haben Recht. Ich habe die Antwort korrigiert, da ich die Frage falsch gelesen habe. –
Jetzt entspricht es @Carl Norums Antwort. – chacham15