この答えは、アルネの論理的根拠が正しかった事例に触発されています。ベンダーは、かつてCとC ++の両方をサポートしていたライブラリを作成しました。ただし、最新バージョンはCのみをサポートしていました。コードに残された次の痕跡の指示は誤解を招くものでした。
#ifdef __cplusplus
extern "C" {
#endif
これは、C ++でコンパイルしようとすると数時間かかりました。C ++からCを呼び出すだけの方がはるかに簡単でした。
ifdef __cplusplus規則は、単一責任の原則に違反しています。この規則を使用するコードは、2つのことを同時に実行しようとしています。
- (1)Cで関数を実行する-および-
- (2)C ++で同じ関数を実行します
アメリカ英語とイギリス英語の両方で同時に書き込もうとするようなものです。これは不必要に#ifdef__thequeensenglishスパナ#elif__yankeeenglishレンチ#elseをスローし、コードをコードに#endifを読みにくくする役に立たないツールです。
単純なコードと小さなライブラリの場合、ifdef__cplusplus規則が機能する可能性があります。ただし、複雑なライブラリの場合は、いずれかの言語を選択してそれを使用するのが最善です。一方の言語をサポートすると、両方をサポートしようとするよりもメンテナンスが少なくて済みます。
これは、UbuntuLinuxでコンパイルするためにArneのコードに加えた変更の記録です。
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++
エラーメッセージをいくつか書いていただけませんか