Bu yanıt, Arne'nin mantığının doğru olduğu bir durumdan esinlenmiştir. Bir satıcı, bir zamanlar hem C hem de C ++ 'yı destekleyen bir kitaplık yazdı; ancak en son sürüm yalnızca C'yi destekledi.
#ifdef __cplusplus
extern "C" {
#endif
Bu, C ++ 'da derlemeye çalışırken birkaç saatime mal oldu. Basitçe C ++ 'dan C'yi aramak çok daha kolaydı.
İfdef __cplusplus sözleşmesi, tek sorumluluk ilkesini ihlal etmektedir. Bu kuralı kullanan bir kod, aynı anda iki şey yapmaya çalışıyor:
- (1) C - ve - 'de bir işlevi yürütün
- (2) aynı işlevi C ++ 'da yürütün
Aynı anda hem Amerikan hem de İngiliz İngilizcesi yazmaya çalışmak gibi. Bu, gereksiz yere bir #ifdef __thequeensenglish anahtar #elif __yankeeenglish anahtarı #, kodu #endif'i kodun içine okumayı zorlaştıran işe yaramaz bir araç atıyor.
Basit kod ve küçük kitaplıklar için ifdef __cplusplus kuralı çalışabilir; ancak, karmaşık kitaplıklar için en iyisi bir dili veya diğerini seçmek ve ona bağlı kalmaktır. Dillerden birini desteklemek, her ikisini de desteklemeye çalışmaktan daha az bakım gerektirecektir.
Bu, Ubuntu Linux'ta derlemek için Arne'nin kodunda yaptığım değişikliklerin bir kaydı.
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++
hata mesajları yazabilir misiniz