c++文件中引用C代码
下面提供一个比较完整的示例程序,一共有四个文件: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代码的更多相关文章
- JavaScript进阶(二)在一个JS文件中引用另一个JS文件
在一个JS文件中引用另一个JS文件 转载地址:http://blog.csdn.net/zndxlxm/article/details/7875787 方法一 在调用文件的顶部加入下例代码 ...
- vue单文件中引用路径的处理
原文地址:vue单文件中引用路径的处理如有错误,欢迎指正! vue单文件的开发过程中,在单文件模版中可能会涉及到文件路径的处理,比如 <img>, style 中的 background ...
- 在C的头文件中定义的结构体,如何在cpp文件中引用
解决方案1:在cpp文件中放置.c,且在该文件中引用变量 解决方案2:在一个cpp文件中包含.c,但在另一个cpp文件中使用结构体变量 cpp文件1 cpp文件2 #include "dia ...
- 在.vue文件中让html代码自动补全的方法(支持vscode)
在.vue文件中让html代码自动补全的方法(支持vscode) https://blog.csdn.net/qq_36529459/article/details/79196763 "fi ...
- 在一个JS文件中引用另一个JS文件
方法一,在调用文件的顶部加入下例代码: document.write(”<script language=javascript src=’/js/import.js’></scrip ...
- JS文件中引用另一个JS文件
1.生产项目上遇到一个Bug,需要修改JS文件,添加Jquery代码,但是原来的页面没有添加对Jquery文件的引用,无法修改原来的页面(自动生成的HTML) 这就需要在JS文件中添加对Jquery文 ...
- C中头文件在cpp文件中引用和.h文件引用
1.编译器会单独编译每个cpp文件.头文件会复制到cpp文件中. 2.有时会遇到这样的一个问题a.cpp要调用b.cpp中的函数,而b.cpp又要调用a.cpp中的函数.这就牵扯到相互调用.这时如果我 ...
- HTML 或 CSS 文件中引用的图片文件移动到任意位置
对于一个套接字的输入操作,第一步通常涉及等待数据从网络到达,当所等待分组到达时,被复制到内核的某个缓冲区: 第二步就是把数据从内核缓冲区复制到应用进程缓冲区.通过 Session 的 createQu ...
- Js- 在一个JS文件中引用另一个JS文件
在调用文件的顶部加入下例代码: document.write(”<script language=javascript src=’/js/import.js’></script> ...
随机推荐
- 电脑cpu100%的原因
这个本地系统占很高的cpu,主要原因是我关机之后,没有关透又重启了,就是管了机之后等10几秒再开机会好
- vue-concise-slider 一个轻量的vue幻灯片组件
vue-concise-slider 一个轻量的vue幻灯片组件 阅读 541 收藏 35 2017-07-03 原文链接:github.com 外卖订单处理有烦恼?试试美团点评餐饮开放平台吧,可实现 ...
- Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag.
https://blog.csdn.net/watermusicyes/article/details/44963773 Context中有一个startActivity方法,Activity继承自C ...
- Camstar :新加的modeling对象没有在 modeling的下拉框中显示
解决: 对象的maint 的 advance option client ui 要打上勾.
- AdminLTE 动画时间
app.js AdminLTE.css
- CSS垂直翻转/水平翻转提高web页面资源重用性
/*水平翻转*/ .flipx { -moz-transform:scaleX(-1); -webkit-transform:scaleX(-1); ...
- 网页性能优化:防止JavaScript、CSS阻塞浏览器渲染页面
网页中引用的外部文件: JavaScritp.CSS 等常常会阻塞浏览器渲染页面.假设在 <head> 中引用的某个 JavaScript 文件由于各种不给力需要2秒来加载,那么浏览器渲染 ...
- 二 random模块
1 import random 2 3 print(random.random())#(0,1)----float 大于0且小于1之间的小数 4 5 print(random.randint(1,3) ...
- STL::map/multimap
map: 默认根据 key 排序(从小到大),能够通过 backet operator(operator [ ]) 来获取元素,内部由二叉搜索树来实现(binary search trees). mu ...
- NumPy 统计函数
NumPy 统计函数 NumPy 提供了很多统计函数,用于从数组中查找最小元素,最大元素,百分位标准差和方差等. 函数说明如下: numpy.amin() 和 numpy.amax() numpy.a ...