이 답변은 Arne의 근거가 올바른 경우에서 영감을 얻었습니다. 한 공급 업체가 한때 C와 C ++를 모두 지원하는 라이브러리를 작성했습니다. 그러나 최신 버전은 C 만 지원했습니다. 코드에 남겨진 다음 흔적 지시문은 오해의 소지가 있습니다.
#ifdef __cplusplus
extern "C" {
#endif
이로 인해 C ++로 컴파일하는 데 몇 시간이 소요되었습니다. 단순히 C ++에서 C를 호출하는 것이 훨씬 쉬웠습니다.
ifdef __cplusplus 규칙은 단일 책임 원칙을 위반합니다. 이 규칙을 사용하는 코드는 한 번에 두 가지 작업을 수행하려고합니다.
- (1) C에서 함수 실행-및-
- (2) C ++에서 동일한 기능 실행
미국식 영어와 영국식 영어를 동시에 쓰려고하는 것과 같습니다. 이것은 불필요하게 #ifdef __thequeensenglish 스패너 #elif __yankeeenglish 렌치 #else 코드를 코드로 읽기 어렵게 만드는 쓸모없는 도구입니다.
간단한 코드와 작은 라이브러리의 경우 ifdef __cplusplus 규칙이 작동 할 수 있습니다. 그러나 복잡한 라이브러리의 경우 한 언어 또는 다른 언어를 선택하고 그대로 유지하는 것이 가장 좋습니다. 언어 중 하나를 지원하는 것은 둘 다 지원하는 것보다 유지 관리가 덜 필요합니다.
이것은 Ubuntu Linux에서 컴파일하기 위해 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++
오류 메시지