Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.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头文件的结构 #ifdef __cplusplus extern "C" { #endif typedef struct TestParameters { long p1; long p2; long p3; } TestParameters_t; #ifdef __cplusplus }_C++_C_Reference - Fatal编程技术网

C+中对C结构的引用+; 我需要在C++代码中使用一些C定义的结构。下面是C头文件的结构 #ifdef __cplusplus extern "C" { #endif typedef struct TestParameters { long p1; long p2; long p3; } TestParameters_t; #ifdef __cplusplus }

C+中对C结构的引用+; 我需要在C++代码中使用一些C定义的结构。下面是C头文件的结构 #ifdef __cplusplus extern "C" { #endif typedef struct TestParameters { long p1; long p2; long p3; } TestParameters_t; #ifdef __cplusplus },c++,c,reference,C++,C,Reference,下面的代码进行编译,但行为是否按照标准定义和有效,以接收C实例作为引用并使用它 TestParameters_t testParams; test(testParams); // Is it valid to receive a C struct instance as a reference in C++ code void test(TestParameters_t &testParams) { } 是的,即使该结构来自C头文件,也可以使用它,就像您在C++头文件中定义的结构一

下面的代码进行编译,但行为是否按照标准定义和有效,以接收C实例作为引用并使用它

TestParameters_t testParams;
test(testParams);

// Is it valid to receive a C struct instance as a reference in C++ code
void test(TestParameters_t &testParams)
{

}

是的,即使该结构来自C头文件,也可以使用它,就像您在C++头文件中定义的结构一样。 与其使用其值,不如使用其引用或地址传递结构

如果函数不修改它,请不要忘记将其标记为const

void test( const TestParameters_t &testParams)
{
  // Won't modify testParams;
}


<> >只要在C++代码中使用测试< /COD>,不仅允许使用引用,而且推荐参数传递方式。


作为非法使用的一个例子,您可以尝试将其转换为<代码>空洞(*)(TestPoalsRsT**)< /C> >并将此指针作为回调传递给某些C代码——这是非法的,调用未定义的行为。

< P>是的,这将在C++中工作得很好。

一般C是C++的子集,但也有例外。正常的

struct
定义和用法不属于例外

Wikipedia在完整列出例外方面做得很好,不过:

我在写C++的时候,会提到第二个关于代码< > const 引用的观点。
<>我想你知道,<代码>外“C”<代码>防止C++的名字被篡改,这样在C代码>外部代码>代码>范围内的任何东西也可以被C使用吗?如果您只打算在C++代码中使用那个<代码>结构> <代码> <强> > < /强>。我建议删除所有
extern
内容。还要注意,如果你只在C++中,你就不再需要<代码> TyPulfF或后缀名称。 在C++中,您可以定义如下的代码>结构> /代码>:

struct TestParameters {
    long     p1;
    long     p2;
    long     p3;
};
然后将其简单地用作:
TestParameters


但是只有在删除C支持时才这样做。

我不明白为什么这会成为问题。@AlexFarber:不,它会影响链接。名称混乱可能是链接最明显的方面,但调用约定也可能受到影响。@在C结构中,MSalter不能有成员函数,链接的概念仅适用于表示对象和函数的标识符。因此,
extern“C”
TestParameters
没有影响(尽管可能,如果有指向函数的指针的话)。请注意条件
\ucplusplus
。这个代码仍然是编译为C,所以绝对代码是绝对需要的。@ MsAlter是的,我同意,但是因为调用代码使用了一个引用,这显然是C++的。我的想法是,如果OP仅仅把代码移到C++环境中,这可能是有益的。我编辑以澄清。@MSalters这是使用一些开源库生成的代码。我们没有计划把它转换成C++structs@Sirish啊,很好,忽略水平线以下的所有东西。
struct TestParameters {
    long     p1;
    long     p2;
    long     p3;
};