这是一个新手问题。
答案 0 :(得分:6)
是。没有理由不能在C ++中使用C库。如果你想在C ++编译器中编译 C,情况会发生变化。 C ++完全支持C ABI,但从API的角度来看,事情并不一定如此简洁。某些C添加项如restrict
不符合C ++标准,必须小心处理。
答案 1 :(得分:2)
如果使用extern "C" { ... }
正确保护标头,则为是。
答案 2 :(得分:0)
答案是肯定的。看看这个:
答案 3 :(得分:0)
是的,没有。
问题是......
Compund literals
原生复数数据类型
“限制”关键字
Variadic宏
“long long int”数据类型
C中的一些功能包含在C ++ 0x中,有些在“普通”C ++的许多新编译器中可用作库扩展。
所以它取决于你所谈论的C级别,C ++标准的级别,以及编译器实现的什么级别的编译器实际上总是对标准和错误提供不同的支持。
然后在C ++中使用的关键字没有在C中定义,因此可以在C中用作变量名,但会使C ++编译器失效。在C语言中使用以下单词作为变量或函数名称是完全合法的,但它们显然会使C ++变得异乎寻常......
哦和“goto”在C ++和C中表现不同。在C ++中,“goto”不能用于跳过变量的初始化,但是对于C来说是可以的。对于switch语句也是如此。在C中,您可以编写一个switch语句或一组goto,它们不能用C ++编译。
还有什么? “strchr”在C vs C ++中的工作方式不同。在C中它返回一个char指针。在C ++中,它返回 const char指针。如果你在C语言中以某种方式使用strchr的那个输出,那么由于C ++的const正确性,它可能会在C ++中被打破。
内联函数的处理方式不同。在C中,它们的作用域是文件,但在C ++中,它们默认具有外部链接。
C ++代码需要使用 extern“C”定义的函数原型来调用C函数。
C ++破坏了函数名的符号,但C却没有。
“从理论上讲,理论与实践没有区别。在实践中有。” - Yogi Berra
答案 4 :(得分:0)
我认为我的人为实例会告诉你为什么它并不总是可能的:
#ifndef HEADER_H
#define HEADER_H
int class(int a, int b);
int private(int a);
#endif
完全有效的C但它不会在C ++中编译,即使使用extern“C”块也是如此。据我所知,使用这样的C库的唯一方法是创建另一个调用这些函数的C库,然后在C ++代码中使用该包装库。
那就是说,我认为在“现实世界”中绊到这样的事情是非常罕见的。