下面提供一个比较完整的示例程序,一共有四个文件:main.cpp、test.c、test.h、test.hpp

main.cpp

#include "test.hpp"

int main()
{
fun();  //相当于在公共命名空间 return ;
}

test.hpp

#ifndef _TEST_HPP_
#define _TEST_HPP_ #ifndef __cplusplus
#error Do not include the hpp header in a c project!
#endif //__cplusplus extern "C" {
#include "test.h"
} #endif //_TEST_HPP_

test.c

#include <stdio.h>
#include "test.h" void fun(void)
{
printf("test...\n"); return ;
}

test.h

#ifndef _TEST_H_
#define _TEST_H_ void fun(void); #endif

上边所示程序不能直接用 g++ 编译,因为 g++ 在编译 test.c 时候函数 fun 由于没加 extern ”C“ {},所以编译时候会给 fun() 按照C++编译规则生成符号表,在main中调用时候,按照 C 的符号来找,就会找不到这个函数,

正确的编译步骤是,先将 C, cpp 文件编译成 .o ,然后通过 g++ 将两个文件链接起来。

$ gcc -c test.c -o test.o

$ g++ -c main.cpp -o main

$ g++ main.o test.o -o test

$ ./test
test...

所以C++中调用C应该有一个统一的格式,即是在什么位置加 extern "C" {}

上边的那种形式,将 test.h 用 test.hpp 封装起来,但是在 test.c 中没有加 external "C" {} ,所以需要先将 C 文件编译成.o,或者库的形式来调用。

还有另一种形式就是,在所有C文件中,都加上

#ifdef __cplusplus

external "C" {

#endif  //__cplusplus

    /*   code     */

#ifdef __cplusplus

}

#endif  //__cplusplus

这样的话,可以用 g++ 正常编译 C 程序,C程序就相当于在公共命名空间声明的C++,当C++公共命名空间中有跟C中的函数完全一样的(名称,参数,返回值都一样)函数的时候,此时g++编译器不会重载,会报错

函数重复定义。

c++文件中引用C代码的更多相关文章

  1. JavaScript进阶(二)在一个JS文件中引用另一个JS文件

    在一个JS文件中引用另一个JS文件       转载地址:http://blog.csdn.net/zndxlxm/article/details/7875787 方法一 在调用文件的顶部加入下例代码 ...

  2. vue单文件中引用路径的处理

    原文地址:vue单文件中引用路径的处理如有错误,欢迎指正! vue单文件的开发过程中,在单文件模版中可能会涉及到文件路径的处理,比如 <img>, style 中的 background ...

  3. 在C的头文件中定义的结构体,如何在cpp文件中引用

    解决方案1:在cpp文件中放置.c,且在该文件中引用变量 解决方案2:在一个cpp文件中包含.c,但在另一个cpp文件中使用结构体变量 cpp文件1 cpp文件2 #include "dia ...

  4. 在.vue文件中让html代码自动补全的方法(支持vscode)

    在.vue文件中让html代码自动补全的方法(支持vscode) https://blog.csdn.net/qq_36529459/article/details/79196763 "fi ...

  5. 在一个JS文件中引用另一个JS文件

    方法一,在调用文件的顶部加入下例代码: document.write(”<script language=javascript src=’/js/import.js’></scrip ...

  6. JS文件中引用另一个JS文件

    1.生产项目上遇到一个Bug,需要修改JS文件,添加Jquery代码,但是原来的页面没有添加对Jquery文件的引用,无法修改原来的页面(自动生成的HTML) 这就需要在JS文件中添加对Jquery文 ...

  7. C中头文件在cpp文件中引用和.h文件引用

    1.编译器会单独编译每个cpp文件.头文件会复制到cpp文件中. 2.有时会遇到这样的一个问题a.cpp要调用b.cpp中的函数,而b.cpp又要调用a.cpp中的函数.这就牵扯到相互调用.这时如果我 ...

  8. HTML 或 CSS 文件中引用的图片文件移动到任意位置

    对于一个套接字的输入操作,第一步通常涉及等待数据从网络到达,当所等待分组到达时,被复制到内核的某个缓冲区: 第二步就是把数据从内核缓冲区复制到应用进程缓冲区.通过 Session 的 createQu ...

  9. Js- 在一个JS文件中引用另一个JS文件

    在调用文件的顶部加入下例代码: document.write(”<script language=javascript src=’/js/import.js’></script> ...

随机推荐

  1. Loading Assets from AssetBundles

    [Loading Assets from AssetBundles] 1.LoadAsset GameObject gameObject = loadedAssetBundle.LoadAsset&l ...

  2. hello world讲解1

    1. HelloWorld程序解析---------------------------------------------------------------------------------- ...

  3. django 导入数据库

    python manage .py makemigrations appname python manage.py migrate

  4. style标签下的CSS代码的显示与实时编辑

    style标签也是标签 首先设置body style的样式 body style{ display:block; padding:0.6em 0.8em; border:1px dashed #ccc ...

  5. zabbix3.0.4安装部署与SendEmail报警配置

    MySQL:5.6.21 nginx:1.62 PHP:5.7 pcre:8.32 zabbix:3.0.4 LNMP安装步骤略过 # tar xvf zabbix-3.0.4.tar.gz # cd ...

  6. 第二章 向量(a)接口与实现

  7. 我和struts2 的第一天

    文字解析 1.获取正文请求 2.根据请求做出判断 3.执行具体的方法代码 4.跳转页面,展示给用户 Strut 是Apache发行的MVC框架 他只是表现层的框架 Strut1 是2005年流行的框架 ...

  8. UVA1588-Kickdown

    2018-10-30-18:27:03 原题链接 题目描述: 给出两个长度分别为n1,n2且每列高度只为1或2的长条,需要将它们放入一个高度为3的容器,求出能够容纳他们的最短容器长度. 本题思路: 模 ...

  9. Python+Selenium学习--定位一组对象

    场景 从上一节的例子中可以看出,webdriver可以很方便的使用find_element方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,这时候就需要使用find_elements方法. ...

  10. Unity 场景分页插件 World Streamer 支持无限大地图的解决方案(二)

    Terrain Streaming 可以用WorldCreator创建Tile地形,然后用WorldStreamer实现分块地图.比如10000*10000(16平方公里) 的地形,需要1000*10 ...