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> ...
随机推荐
- svn转git
在Git Bash 中输入 git-svn clone http://devsvnread.uuzuonline.net/GOT_PRIVATE/server/ --no-metadata -T tr ...
- java基本数据间转换
string=====>int int x = Integer.parseInt(“1111”); string=====>char char x = request.getParamet ...
- python学习 day19 configparser模块 os模块 subprocess模块
上周五回顾 logging 用于记录日志 四种核心角色: 生成器Logger 过滤器Filter 处理器Handler 格式化处理器 Formatter logging.info.debug 使用默认 ...
- django实现分页
分页实现思路: 1.接口拉取库内数据,进行分页 2.页面实现分页组件,切换不同链接 一.接口实现: from django.core.paginator import Paginator p=Pagi ...
- oracle授予调用存储过程权限
参考 https://blog.csdn.net/h254532693/article/details/45364317 grant execute on PROCEDURENAME to USERN ...
- 调css时候,设置margin-left没有效果
调css时候,如果设置margin-left没有效果,可能是span不是块元素.设置display:block;即可.
- SpringCloud报错:Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
今天启动用eureka的服务消费者时,一直出现问题. SpringCloud报错: Caused by: org.springframework.context.ApplicationContextE ...
- 第十一章 串 (b1)串匹配
- Centos7 下的NTP-server(Chorny) 部署及客户端时间同步配置
一.介绍 1.本博客以 ceph 集群搭建时的NTP-server 为例. 2.hosts # vim /etc/hosts 10.6.32.20 ceph1 (作为时间服务器) 10. ...
- TZOJ 1210 The area(微积分)
描述 Ignatius bought a land last week, but he didn't know the area of the land because the land is enc ...