C与CPP文件的区别

在编译源文件时,C编译器和C++编译器都会对符号(函数或变量)名作某些修正,但两者采用的修正方法不同,所以两者生成的目标文件不能互相链接。在C++中使用extern "C"可以让C++符号获得C链接特性。由于C++编译器会自动定义__cplusplus宏,所以在C语言头文件中采用这种结构可以保证无论使用何种编译器,生成的目标文件都具有C链接特性,能够与标准C编译器所生成的目标文件相链接。

通常c/c++编译器会根据文件后缀来选择符号修正,所以最好把c的代码放到.c文件中,把c++的代码放到.cpp文件中。

我用VC++6.0创建动态库,做了以下试验。

在test.cpp中输出c函数,如下:

1、新建Win32 Dynamic-Link Library

2、输出函数

extern "C" _declspec(dllexport) void test();

void test()

{

 

}

而在test.c中输出c函数,就可以这样,如下:

1、新建Win32 Dynamic-Link Library

2、输出函数

_declspec(dllexport) void test();

void test()

{

 

}

 

ContractedBlock.gifExpandedBlockStart.gifCode


//DLL.c

int  test(int a,int b)
{
 
return a+b;
}


//DLL.def
LIBRARY   CDLL
EXPORTS
   test   @1



 

//CTestDLL.cpp
extern "C" {
 _declspec(dllimport) 
int test(int a,int b);
}
int main(int argc, char* argv[])
{

 printf(
"Hello World!\n %d",test(1,2));
 
return 0;
}

### 关于 `.c` `.cpp` 文件区别 `.c` 文件通常用于纯 C 语言编写的程序,而 `.cpp` 文件则专属于 C++ 编程语言。两者的主要区别在于语法特性、功能支持以及编译方式的不同。 #### 1. **编程范式的差异** C 是一种过程式编程语言,主要依赖函数调用来实现逻辑操作[^1]。相比之下,C++ 支持面向对象编程(OOP),允许定义类对象来封装数据行为。因此,在 `.cpp` 文件中可以使用诸如继承、多态等高级特性,而在 `.c` 文件中这些概念并不存在。 #### 2. **命名空间的支持** C++ 引入了 `namespace` 的概念,这使得开发者能够更好地管理全局变量函数名称冲突问题。然而标准 C 并不支持这一机制,所有的声明都默认处于单一的全局作用域下。 ```cpp // 使用命名空间的例子 (仅限 .cpp 文件) namespace MyNamespace { void myFunction() {} } ``` #### 3. **标准库的不同** 虽然两者的部分基础功能重叠,但它们各自拥有独立的标准库集合。例如,在处理字符串时,C 提供的是基于字符数组的操作集;而 C++ 则引入了更现代化的对象形式——`std::string` 类型: ```cpp #include <iostream> #include <string> int main(){ std::string greeting = "Hello, world!"; std::cout << greeting; return 0; } ``` 上述代码片段展示了如何利用 C++ 中内置的数据结构轻松完成任务,这是传统 C 风格难以匹敌的优势之一。 #### 4. **模板泛型编程能力** 作为现代软件开发的重要工具之一,“模板”让程序员得以创建通用算法而不必关心具体类型细节。这种灵活性只有在编写 `.cpp` 源码期间才可获得。 ```cpp template<typename T> T max(T a,T b){ return (a>b)?a:b; } ``` 以上实例说明了借助模板技术可以使我们的解决方案更加灵活高效。 #### 5. **异常处理机制** 错误恢复策略上也存在显著差别:尽管某些扩展版本可能增加了有限的支持度,原始形态下的 ANSI-C 不具备正式的 try-catch 结构来进行运行期异常捕捉。相反地,整个系列围绕着返回状态码构建起一套完整的诊断体系。此同时,C++ 显然在这方面迈出了重要一步,提供了完善的异常捕获框架以便及时响应各种意外情况的发生。 --- 综上所述,当项目需求较为简单或者追求极致效率的时候可以选择采用 `.c` 扩展名代表的经典方法论进行编码实践;而对于那些期望充分利用抽象层次提升维护便利性的场合,则毫无疑问应该倾向于选用 `.cpp` 形成的整体架构设计思路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值