这个答案的灵感来自Arne的理论依据是正确的情况。一个供应商编写了一个库,该库曾经支持C和C ++。但是,最新版本仅支持C。代码中留下的以下残留伪指令具有误导性:
#ifdef __cplusplus
extern "C" {
#endif
这花了我几个小时尝试用C ++进行编译。简单地从C ++调用C会容易得多。
ifdef __cplusplus约定违反了单一责任原则。使用此约定的代码试图同时做两件事:
- (1)在C中执行一个函数-和-
- (2)在C ++中执行相同的功能
就像试图同时用美式英语和英式英语写作一样。这不必要地导致#ifdef __thequeensenglish扳手#elif __yankeeenglish扳手#else一个无用的工具,这会使代码更难于阅读#endif到代码中。
对于简单的代码和小型库,ifdef __cplusplus约定可能适用;但是,对于复杂的库,最好选择一种或另一种语言并坚持使用。与支持两种语言相比,支持其中一种语言所需的维护较少。
这记录了我对Arne代码进行的修改,以使其可以在Ubuntu Linux上进行编译。
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);
}
生成文件
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++
错误消息