Что двоеточие означает в объявлениях структуры в C?

Управление версиями с Подрывной деятельностью

А очень хороший ресурс для управления исходным кодом в целом. Едва ли конкретный TortoiseSVN, все же.

9
задан sth 28 December 2013 в 17:16
поделиться

4 ответа

Это синтаксис C ++, эквивалентный этому:

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

Это нормальный синтаксис для наследования классов, здесь texmacs_input_rep наследуется от specific_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 , за которой следует необязательный идентификатор. , за которым следует {. Или только struct , за которой следует идентификатор (предварительное объявление). В любом случае нет места для дополнительного : ... там.

: , упомянутый позже в этом параграфе стандарта, касается ширины битового поля, как это;

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

Здесь a и b ] имеют ширину всего 4 и 3 бита, но это другой синтаксис, чем в вопросе.

22
ответ дан 4 December 2019 в 06:49
поделиться

GCC это не нравится (в режиме C, конечно).

И глядя на спецификацию, я не вижу, что это определено на странице 113 (6.7.2.1), это говорит:

struct-declarator:
    declarator
    declarator_opt : constant-expression

, что является синтаксисом для битовых полей, подобных этому:

struct blah {
    int a : 4;
    int b : 4;
};

Итак, вкратце: это не C, это C ++, и это наследование, подобное наследованию классов.

7
ответ дан 4 December 2019 в 06:49
поделиться

: в тексте стандарта не является частью конструкции C. Он служит для разделения определяемой вещи и ее определения.

Недопустимо использование : в объявлении структуры.

2
ответ дан 4 December 2019 в 06:49
поделиться

Вы уверены, что это C?

Стандартный документ, на который вы ссылаетесь, не описывает такой синтаксис, который я мог видеть.

Это похоже на C ++, где он действительно находится раньше говорили, что структура наследует другую структуру. На странице компиляции TeXmacs рекомендуется использовать компилятор C ++, что (для меня) означает, что он написан на C ++, а не C.

Я быстро просмотрел исходный архив TeXmacs и увидел много файлов ".cpp".

3
ответ дан 4 December 2019 в 06:49
поделиться