Diese Antwort ist inspiriert von einem Fall, in dem Arnes Begründung richtig war. Ein Anbieter hat eine Bibliothek geschrieben, die einst sowohl C als auch C ++ unterstützte. Die neueste Version unterstützte jedoch nur C. Die folgenden im Code verbliebenen Anweisungen waren irreführend:
#ifdef __cplusplus
extern "C" {
#endif
Der Versuch, in C ++ zu kompilieren, hat mich mehrere Stunden gekostet. Das einfache Aufrufen von C aus C ++ war viel einfacher.
Die ifdef __cplusplus-Konvention verstößt gegen das Prinzip der Einzelverantwortung. Ein Code, der diese Konvention verwendet, versucht zwei Dinge gleichzeitig zu tun:
- (1) eine Funktion in C ausführen - und -
- (2) Führen Sie dieselbe Funktion in C ++ aus
Es ist, als würde man versuchen, gleichzeitig in amerikanischem und britischem Englisch zu schreiben. Dies wirft unnötigerweise einen #ifdef __thequeensenglish Schraubenschlüssel #elif __yankeeenglish Schraubenschlüssel #else ein nutzloses Werkzeug, das es schwieriger macht, den Code #endif in den Code einzulesen.
Für einfachen Code und kleine Bibliotheken funktioniert möglicherweise die Konvention ifdef __cplusplus. Für komplexe Bibliotheken ist es jedoch am besten, die eine oder andere Sprache auszuwählen und dabei zu bleiben. Die Unterstützung einer der Sprachen erfordert weniger Wartung als der Versuch, beide zu unterstützen.
Dies ist eine Aufzeichnung der Änderungen, die ich an Arnes Code vorgenommen habe, damit er unter Ubuntu Linux kompiliert werden kann.
foo.h :
#ifndef FOO_H
#define FOO_H
void foo(void);
#endif
foo.c
#include "foo.h"
#include <stdio.h>
void foo(void)
{
// modified to verify the code was called
printf("This Hello World was called in C++ and written in C\n");
}
bar.cpp
extern "C" {
#include "foo.h" //a C header, so wrap it in extern "C"
}
int main() {
foo();
return(0);
}
Makefile
# -*- MakeFile -*-
# dont forget to use tabs, not spaces for indents
# to use simple copy this file in the same directory and type 'make'
myfoobar: bar.o foo.o
g++ -o myfoobar foo.o bar.o
bar.o: bar.cpp
g++ -c -o bar.o bar.cpp
foo.o: foo.c
gcc -c -o foo.o foo.c
g++
Fehlermeldungen schreiben