C ++ struct with methods,C声明没有方法

时间:2015-09-17 23:52:13

标签: c++ c oop c++11 struct

我已经高度怀疑它可行而且没有风险,但我仍然想知道,所以这就是我的事......

我有一个C ++代码,它使用相当大的结构(15-30个字段)作为容器,作为类的构造函数的参数。具有这些结构的东西是我需要使用C99语法声明它们(与C ++ ffs不兼容):

FooBar fb = { .foo = 12, .bar = 3.4 };

因为有一个构造函数对我来说是不可想象的,因为在初始化这些结构时可以安全地跳过某些字段,而其他字段则不是,等等(它们仅由&#34完全初始化;用户提供& #34;数据,用户是我出现的情况),有点像他们描述了一个配置。

无论如何,重点是,我使用一个.h标头,使用普通的C语法声明结构,一个.c文件包含我初始化的结构,然后我可以在我的.cpp中访问它们使用extern" C"的文件。它运作良好......除了我能找到方便那些结构的方法。

所以我的问题是,是否可以像这样声明结构

#ifdef __cplusplus
    // C++ compatible declarations with methods
    struct foobar {
        int foo;
        float bar;

        int method1();
        int method2();
        void method3();
        [etc.]
    };
#else
    /* C compatible declarations, no methods */
    struct foobar {
        int foo;
        float bar;
    };
#endif

这样我可以在C ++中使用绑定到结构的一些方法(它更优雅,面向OOP),并且我可以使用C99的指定初始化器在我的C代码中安全地初始化它们。

我担心的是一些可能不为人知的问题,这些问题最终可能导致C代码中的结构错误与C ++代码不同。这些问题是否存在?

由于

1 个答案:

答案 0 :(得分:1)

在C ++ 11中,如果struct标准布局,那么它的布局与等效的C结构相同。构成标准布局结构的规则如下:

A standard-layout class is a class that:

— has no non-static data members of type non-standard-layout class (or array of such types) or reference,

— has no virtual functions (10.3) and no virtual base classes (10.1),

— has the same access control (Clause 11) for all non-static data members,

— has no non-standard-layout base classes,

— either has no non-static data members in the most derived class and at most one base class with non-static data members, or has no base classes with non-static data members, and

— has no base classes of the same type as the first non-static data member.

由于您的结构只有一些公共数据成员和一些非虚方法,因此您的结构是标准布局。你可以用更少的重复来表达它

struct foobar {
    int foo;
    float bar;
#ifdef __cplusplus
    int method1();
    int method2();
    void method3();
#endif
};

在C ++的早期版本中,您的类型必须是普通旧数据(POD)类型,并且还有一些限制。但是,你的结构仍然是POD(没有虚函数,没有构造函数或析构函数,没有基类),所以它仍然与C布局兼容。