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定义的结构。下面是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++头文件中定义的结构一
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++头文件中定义的结构一样。 与其使用其值,不如使用其引用或地址传递结构
如果函数不修改它,请不要忘记将其标记为constvoid test( const TestParameters_t &testParams)
{
// Won't modify testParams;
}
或
<> >只要在C++代码中使用
作为非法使用的一个例子,您可以尝试将其转换为<代码>空洞(*)(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,所以绝对代码struct TestParameters {
long p1;
long p2;
long p3;
};