Pro*_*ica 114
像这样编译C代码:
gcc -c -o somecode.o somecode.c
Run Code Online (Sandbox Code Playgroud)
那么像这样的C++代码:
g++ -c -o othercode.o othercode.cpp
Run Code Online (Sandbox Code Playgroud)
然后使用C++链接器将它们链接在一起:
g++ -o yourprogram somecode.o othercode.o
Run Code Online (Sandbox Code Playgroud)
当你包含C函数的声明时,你还必须告诉C++编译器一个C头.所以othercode.cpp
从以下开始:
extern "C" {
#include "somecode.h"
}
Run Code Online (Sandbox Code Playgroud)
somecode.h
应包含以下内容:
#ifndef SOMECODE_H_
#define SOMECODE_H_
void foo();
#endif
Run Code Online (Sandbox Code Playgroud)
Arn*_*rtz 57
让我从其他答案和注释中收集点点滴滴,给你一个干净分离的C和C++代码的例子:
foo.h:
#ifndef FOO_H
#define FOO_H
void foo(void);
#endif
Run Code Online (Sandbox Code Playgroud)
foo.c的
#include "foo.h"
void foo(void)
{
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
用这个编译gcc -c -o foo.o foo.c
.
bar.cpp
extern "C" {
#include "foo.h" //a C header, so wrap it in extern "C"
}
void bar() {
foo();
}
Run Code Online (Sandbox Code Playgroud)
用这个编译 g++ -c -o bar.o bar.cpp
然后将它们连接在一起:
g++ -o myfoobar foo.o bar.o
Run Code Online (Sandbox Code Playgroud)
理由:
C代码应该是普通的C代码,没有#ifdef
s代表"也许有一天我会用另一种语言来称呼它".如果一些C++程序员调用你的C函数,那么他们的问题就是如何做到,而不是你的.如果您是C++程序员,那么C头可能不是您的,您不应该更改它,因此处理未extern "C"
编码的函数名(即)属于您的C++代码.
当然,您可以自己编写一个方便的C++标头,除了将C标头包装到extern "C"
声明中之外什么都不做.
gx_*_*gx_ 16
我同意Falken教授的回答,但在Arne Mertz的评论之后我想给出一个完整的例子(最重要的部分是#ifdef __cplusplus
):
somecode.h
#ifndef H_SOMECODE
#define H_SOMECODE
#ifdef __cplusplus
extern "C" {
#endif
void foo(void);
#ifdef __cplusplus
}
#endif
#endif /* H_SOMECODE */
Run Code Online (Sandbox Code Playgroud)
somecode.c
#include "somecode.h"
void foo(void)
{
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
othercode.hpp
#ifndef HPP_OTHERCODE
#define HPP_OTHERCODE
void bar();
#endif /* HPP_OTHERCODE */
Run Code Online (Sandbox Code Playgroud)
othercode.cpp
#include "othercode.hpp"
#include "somecode.h"
void bar()
{
foo(); // call C function
// ...
}
Run Code Online (Sandbox Code Playgroud)
然后你按照Falken教授的指示进行编译和链接.
这是有效的,因为在编译时gcc
,__cplusplus
没有定义宏,所以在预处理之后somecode.h
包含的头somecode.c
是这样的:
void foo(void);
Run Code Online (Sandbox Code Playgroud)
与编译时g++
,那么__cplusplus
被定义的,因此包括在头部othercode.cpp
现在是这样的:
extern "C" {
void foo(void);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
80492 次 |
最近记录: |