C语言中,结构体声明中的冒号代表什么意思?

11

我在阅读 TeXmacs 的代码时,看到了这个:

struct texmacs_input_rep : concrete_struct {
...
};

这是什么意思?

这种语法在C标准中定义,第113页,但我没有找到它的含义,因为我不知道如何阅读语法规则。

因为concrete_struct是另一个struct,其中包含类似于构造函数和虚析构函数的函数,并且因为我在其他地方读到说C++中的类实际上是带有默认公共成员的struct,所以我猜想这是在C中使用struct进行继承的方法(因为这是C标准...)。

这样正确吗?


如果这只涉及到 C 问题,您应该删除 c++ 标签。在 c++ 中,该声明是正确的。 - HyLian
1
该语法在C标准中未定义...你确定你知道如何阅读语法规则吗? - fortran
没错,我读得太快了,而且我也怀疑它是C语言... 是的,我知道如何阅读语法规则。 - Gzorg
我一直认为struct是C语言的,我不知道它在C++中已经被扩展了。这就是为什么我故意标记它为C和C++的原因。 - Gzorg
4个回答

26

这是C++语法,等价于:

class texmacs_input_rep : public concrete_struct {
public:
...
};

这是类继承的正常语法,这里texmacs_input_rep继承自concrete_struct

关于C语言的语法:

你链接的C标准定义(6.7.2.1):

struct-or-union-specifier:
    struct-or-union identifieropt { struct-declaration-list }
    struct-or-union identifier

struct-or-union:
    struct
    union

所以在C语言中,必须是struct,后面是可选的identifier,然后是{。或者仅是struct后面跟一个identifier(前向声明)。在这两种情况下,都没有额外的空间可以加上: ...

标准中稍后提到的:是关于位域宽度的,像这样:

struct foo {
  unsigned a : 4;
  unsigned b : 3;
};

这里的ab只有4位和3位,但这与问题中的语法不同。


7

GCC 不支持这个(当然是在 C 模式下)。

查看规范,我没有在第 113 页(6.7.2.1)中找到定义,它说:

struct-declarator:
    declarator
    declarator_opt : constant-expression

这是位域的语法,例如:
struct blah {
    int a : 4;
    int b : 4;
};

简而言之:这不是C语言,而是C++语言,并且它的继承类似于类的继承。

3

你确定这是C语言吗?

我看到的标准文档没有描述这样的语法。

这看起来像是C++,在那里它确实用于表示结构体继承另一个结构体。TeXmacs编译页面建议您使用C++编译器,这意味着它是用C++编写的,而不是C。

我快速查看了TeXmacs源代码存档,并看到了许多“.cpp”文件。


你没有看过帖子中引用的C规范吗?他是完全正确的……虽然我也对规范试图表达的意思感到困惑。 - Benj
@Benj:我确实看了,但我不同意,他是不正确的。请看246tNt的回答。 - unwind

2

标准文本中的冒号:并不是C语言结构的一部分,它用于区分被定义的事物和其定义。

在结构声明中,使用冒号:是无效的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接