您的位置:首页 > 编程语言 > C语言/C++

C++基础学习之7 - 与C程序对话

2017-01-12 22:26 162 查看
C++当初设计该语言的初衷是 “C”扩展,所以C++一般被认为是C的超集,但“这并不意味着C++兼容C语言的所有东西”。C++保留了一部分过程式语言的特点,大部分的C代码可以很轻易地在C++中正确编译,但仍有少数差异,导致某些有效的C代码在C++中无法通过编译。因此,从C到C++,我们要因为这些差异而做出一些改变,我们应当熟悉这些差异,使用原有的丰富的C库为现在的C++工程更好地服务。那么在C++程序中是否可以调用C程序代码呢?
先不置可否,我们来看 C程序与C++程序不同的编译方式:
对于下面的函数:
void func_add(int a,int b); C程序在编译时会生成 _func_add 类型的符号; C++程序在编译时会生成 _func_add_int_int 类型的符号(这种机制为C++的函数重载提供了支持);
这种符号不一致导致我们无法直接调用,我们在C++中调用C程序代码会出现问题,error LNK2019: 无法解析的外部符号,很熟悉吧。
解决方案有木有?,这里面的桥梁就是 extern “C”修饰符 。extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。被extern "C" 修饰的变量和函数要按照C语言方式进行编译和链接。
在CPP中调用时,通过添加 extern “C” 指定里面的函数按照C风格编译:/** c语言头文件:CAdd.h */
#ifndef C_ADD_H
#define C_ADD_H
extern int add(int a,int b);
#endif
/** C语言实现文件:CAdd.c */
#include "CAdd.h"
int add(int a,int b)
{
return a+b;
}

/** C++实现文件,调用add*/
extern "C"
{
#include "CAdd.h"
}
int main(int argc, char* argv[])
{
add(2,3);
return 0;
} 同样,当C++调用一个C生成的 DLL 时,也需要参照上面的方法修饰。
我们在编写C代码的时候,由于在C语言中不支持 extern "C" 声明,为了让头文件同时兼容C和C++,我们一般会这样来实现:
#ifdef __cplusplus
extern "C" {
#endif

int add (int a, int b);

#ifdef __cplusplus
}
#endif 通过添加 宏__cplusplus 进行条件判断,我们能够有效保证 头文件能够在C和C++中同时使用。

@ 程序崩溃时如何调试?
1)#ulimit -c unlimited 打开core文件生成 (ulimit -c 0 关闭)
2)core文件的命名规则
/proc/sys/kernel/core_uses_pid 1 表示使用procid命名,0表示不使用
/proc/sys/kernel/core_pattern 可以设置格式化的 core 文件保存位置或文件名
echo “/opt/corefile/core-%e-%p-%t” > /proc/sys/kernel/core_pattern 控制所产生的 core 文件会存放到 /corefile 目录下,文件名为 core- 命令名 -pid- 时间戳
参数列表 :
%p - insert pid into filename 添加 pid
%u - insert current uid into filename 添加当前 uid
%g - insert current gid into filename 添加当前 gid
%s - insert signal that caused the coredump into the filename 添加导致产生 core 的信号
%t - insert UNIX time that the coredump occurred into filename 添加 core 文件生成时的 unix 时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加命令名
3)采用 gdb 调试 core文件, gdb [exec file] [core file]
注:需要添加调试开关 -g : gcc -o main -g main.c
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息