Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C和C++;编码标准 关于C和C++编码标准的最佳实践是什么?应该允许开发者随意地将它们混合在一起。连接C和C++对象文件时是否有任何并发症?_C++_C_Standards - Fatal编程技术网

C和C++;编码标准 关于C和C++编码标准的最佳实践是什么?应该允许开发者随意地将它们混合在一起。连接C和C++对象文件时是否有任何并发症?

C和C++;编码标准 关于C和C++编码标准的最佳实践是什么?应该允许开发者随意地将它们混合在一起。连接C和C++对象文件时是否有任何并发症?,c++,c,standards,C++,C,Standards,像传统上用C编写的套接字库这样的东西应该保留在C中并保存在单独的源文件中吗?这是将C代码保存在.cp文件和C++文件中.cpp文件中。 在用G++解析C和C++时,会有任何性能损失,因为类型化检查不是用C来完成的吗?但在C++中。将是连接C和C++源代码文件的最好方法。 最大的问题是用C++代码调用C函数,反之亦然。在这种情况下,您需要确保使用extern“C”将函数标记为具有“C”链接。您可以在头文件中直接使用以下命令执行此操作: #if defined( __cplusplus ) exte

像传统上用C编写的套接字库这样的东西应该保留在C中并保存在单独的源文件中吗?这是将C代码保存在.cp文件和C++文件中.cpp文件中。
在用G++解析C和C++时,会有任何性能损失,因为类型化检查不是用C来完成的吗?但在C++中。将是连接C和C++源代码文件的最好方法。

最大的问题是用C++代码调用C函数,反之亦然。在这种情况下,您需要确保使用

extern“C”
将函数标记为具有“C”链接。您可以在头文件中直接使用以下命令执行此操作:

#if defined( __cplusplus )
extern "C" {
#endif

extern int myfunc( const char *param, int another_one );

#if defined( __cplusplus )
}
#endif
您需要
#if
s,因为包含它的C代码无法理解
外部“C”

如果你不想(或不能)改变头文件,你可以在C++代码中执行:

extern "C" {
#include "myfuncheader.h"
}

你可以用C++方式把C++函数标记为C链接,然后你可以用C代码调用它。不能为重载函数或C++类这样做。


除此之外,C和C++的混合应该没有问题。我们有几十年的C++函数,它们仍然在C++代码中使用。

C++在运行时不做“类型化检查”,除非你要求它们(使用<代码> DyrimixCase)。C++与C非常兼容,因此可以随意调用C库,并用C++编译器编译C代码。C++并不意味着“面向对象”,并且不应该使用它来执行性能惩罚。
<>如果你将编译的代码与GCC和G++混合,请参阅格雷姆的答案。

< P>如果你用G++编译所有的源代码,那么它都是用C++对象文件编译的(即适当的名字修改和C++ ABI)。 如果您正在构建需要由需要使用C ABI的显式C应用程序使用的库,那么只需要使用extern“C”技巧


如果所有的东西都编译成一个可执行文件,那么使用C++,把所有的东西都当作C++ +< /p> < p>如果C++中有一个函数调用C中的函数,它又调用C++中的另一个函数,这个函数抛出一个应该被第一个函数捕获的异常,除非告诉C编译器启用异常处理表的生成,否则可能会出现问题


,对于gcct,这是默认的C++启用的参数,但对于C.< /P> < P>默认是禁用的。这里没有好的硬规则。

如果最终产品总是与C++主机()连接,那么它就没什么关系了。因为你总是可以创建标题来做正确的事情

如果你创建一个库,需要一个C和C++接口,但是你不能假设C++链接器,那么你需要确保你把C++ API与C++完全分离了。此时,C++中的所有工作通常都是更干净的,并且使用C++类来代理C.

例如:

/* c header */

struct CData
 { /* stuff */ };

void init( CData* data );
void fini( CData* data );
int getSomething( CData* data );
void doSomething( CData* data, int val );

// c++ header

extern "C" {
#include cdata.h
};

class CppData : private CData
 {
 public:
   CppData() { ::init( (CData*)this ); }
   ~CppData() { ::fini( (CData*)this ); }
   int getSomething() { return ::getSomething( (CData*)this ); }
   void doSomething( int val ) { :: doSomething( (CData*)this, val ); }
 };

我希望这有帮助。

一般应该假定C++可以抛出异常,因此,在你的块中的C包装器函数应该捕获它们,并将它们变形成C调用方可以消化的好错误代码。

extern "c"
{
    int nice_c_function_interface
    (
        void
    )
    {
        int returnStatus;

        try
        {
             returnStatus = nice_cpp_function();
        }
        catch (NiceCppException& that)
        {
             returnStatus = that.failure_code();  
        }
        catch (...)
        {
            cerr << "Oh Worse! an unexpected unknown exception" << endl;

            returnStatus = -1;  // Horrible unknown failure
        }

        return returnStatus;
    }
}
extern“c”
{
int nice_c_函数_接口
(
无效的
)
{
返回状态;
尝试
{
returnStatus=nice_cpp_函数();
}
捕获(异常和那个)
{
returnStatus=that.failure_code();
}
捕获(…)
{

CERP只是一个细节,但是C++编译器将用C编译器编译C。有一些事情C和C++有不同的地方。哦,是的。我认为,OP是指结构化的、调用函数的样式代码,作为“C代码”,我的观点是,这种样式是“C++代码”。同样,因为使用C++没有惩罚,所以人们也不用担心差异,并用C++做任何事情(不一定是OOP!)。