यह उत्तर एक ऐसे मामले से प्रेरित है जहां अर्ने का तर्क सही था। एक विक्रेता ने एक पुस्तकालय लिखा जो एक बार सी और सी ++ दोनों का समर्थन करता था; हालांकि, नवीनतम संस्करण ने केवल सी का समर्थन किया। कोड में छोड़ी गई निम्नलिखित शाब्दिक निर्देश भ्रामक थे:
#ifdef __cplusplus
extern "C" {
#endif
इसने मुझे C ++ में संकलन करने की कोशिश में कई घंटे लगाये। बस C ++ से C को कॉल करना बहुत आसान था।
Ifdef __cplusplus सम्मेलन एकल जिम्मेदारी सिद्धांत का उल्लंघन है। इस सम्मेलन का उपयोग करने वाला एक कोड दो चीजों को एक साथ करने की कोशिश कर रहा है:
- (1) C और - में एक फ़ंक्शन निष्पादित करें
- (2) C ++ में समान फ़ंक्शन को निष्पादित करते हैं
यह एक ही समय में अमेरिकी और ब्रिटिश दोनों अंग्रेजी में लिखने की कोशिश कर रहा है। यह अनावश्यक रूप से #ifdef __thequeensenglish स्पैनर #elif __yankeeenglish रिंच # व्यर्थ # उपकरण को फेंक रहा है जो कोड में #endif को पढ़ने के लिए कोड को कठिन बनाता है।
सरल कोड और छोटे पुस्तकालयों के लिए ifdef __cplusplus सम्मेलन काम कर सकता है; हालांकि, जटिल पुस्तकालयों के लिए एक भाषा या दूसरी को चुनना और उसके साथ रहना सबसे अच्छा है। दोनों में से किसी एक भाषा को समर्थन देने की कोशिश करने से कम रखरखाव होगा।
यह उबंटू लिनक्स पर संकलित करने के लिए मैंने आर्ने के कोड में किए गए संशोधनों का एक रिकॉर्ड है।
foo.h :
#ifndef FOO_H
#define FOO_H
void foo(void);
#endif
foo.c
#include "foo.h"
#include <stdio.h>
void foo(void)
{
printf("This Hello World was called in C++ and written in C\n");
}
bar.cpp
extern "C" {
#include "foo.h"
}
int main() {
foo();
return(0);
}
makefile
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++
त्रुटि संदेश लिख सकते हैं