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> ...
随机推荐
- 项目IDEA启动配置
在所有java启动项中加入 -Djute.maxbuffer=2048000 tomcat 在catalina.bat 中第一行加入 set JAVA_OPTS=-Djute.maxbuffer=20 ...
- java-学习1
作为一个想要深入的程序猿,只是学习前端是不够的,我总结我的前端工作是围绕着html.css.js展开写的再好也是展现在表面,所以 我想学习一门能够深入的后台语言,想来想去我还是选择java作为以后深入 ...
- Linux下修改tab建为4个空格
1.编辑 vim /etc/vim/vimrc 2.修改 set ts=4 set expandtab set autoindent 其实只要set ts=4 就ok了.
- flume kafka 配置指南
1.官方网站也有配置: https://flume.apache.org/FlumeUserGuide.html#kafka-source 2.clodera 官方配置 https://www.clo ...
- 04_web基础(四)之servlet详解
16.17.18.servlet生命周期 javax.servlet.Servlet接口方法:public String getServletInfo():获取Servlet相关信息(作者,版权,版本 ...
- 动态代理 JDK动态代理 CGLIB代理
代理模式:代理类和被代理类实现共同的接口(或继承),代理类中存有指向被代理类的索引,实际执行时通过调用代理类的方法.实际执行的是被代理类的方法. 而AOP,是通过动态代理实现的. 一.简单来说: JD ...
- 使用tor网络
在www.torproject.org/projects/torbrowser.html.en上找到合适的版本下载 下载好tor浏览器之后,解压双击Tor Browser,出现这个错误 这是因为kal ...
- MysqlMd5加密
MD5加密成功
- python——线程相关
使用python的threading中的Thread 下面是两种基本的实现线程的方式: 第一种方式———— #coding=utf-8 """ thread的第一种声明及 ...
- 项目总结08:spring quartz 定时器Demo
将定时器用到的quartz.jar放在lip文件下 quartz.xml文件(完整) <?xml version="1.0" encoding="UTF-8&quo ...