Почему C нужен ключевое слово "struct", а не C ++? - PullRequest
40 голосов
/ 08 декабря 2011

Меня всегда немного смущало, что здесь происходит:

#include <stdio.h>

int main() {  
    timeval tv;
    tv.tv_sec = 1;

    for (;;) {
        select(0, 0, 0, 0, &tv);
        printf("%s\n", "Hello World!");
    }
}

Извините, если это не скомпилируется, просто написал это в качестве быстрого примера.

Код какэто не скомпилируется в gcc, если я не добавлю ключевое слово struct до использования struct timeval.g ++, с другой стороны, обрабатывает все как есть.

Это разница между тем, как C и C ++ обрабатывают структуры, или это просто разница в компиляторах?(Я очень ориентирован на C ++, и использование struct в C в таких строках всегда меня сбивало с толку).

Ответы [ 6 ]

75 голосов
/ 08 декабря 2011

Синтаксически оба обрабатывают struct почти одинаково. Только C ++ добавил дополнительное правило, которое позволяет опускать ключевое слово structclass), если нет двусмысленности.

Если есть неоднозначность, C ++ также требует в некоторых местах ключевое слово struct. Известный пример - stat в системах POSIX, где есть struct stat и функция stat.

10 голосов
/ 08 декабря 2011

Рассмотрим первоначальную идею C ++ (или, когда это была просто идея «C с классами»), идею ОО-ориентированного языка, который был совместим с C до такой степени, что большинство допустимых программ на C также были действительными C ++ программы.

C ++ создал свою модель класса, начав с C's struct и добавив некоторые дополнительные функции:

  1. Наследование (хотя вы можете приблизиться к C, имея первый член структуры, от которой вы хотите "наследовать").
  2. Скрытие информации (через public, private и т. Д.)
  3. Методы-члены (которые изначально были преобразованы макросами в код C вне структуры с добавленным параметром this - многие реализации по-прежнему похожи на практике).

В этот момент возникли две проблемы. Во-первых, доступ по умолчанию должен быть общедоступным, поскольку в C нет скрытия информации, и поэтому с точки зрения C ++ все открыто. Для хорошего ОО следует по умолчанию частное. Это было решено добавлением class, который в значительной степени идентичен struct, за исключением того, что по умолчанию используется private вместо public.

С другой стороны, эта перспектива OO должна иметь timeval или любой другой класс / структуру в том же «основании», что и int или char, а не постоянно помечаться в коде как особые. Это было решено путем ослабления правила о том, что необходимо поместить struct (или class) перед именем типа в объявлении переменной этого типа. Следовательно, struct timeval tv может стать timeval tv.

Это затем повлияло на более поздние ОО-языки С-синтаксиса, такие как Java и C #, до такой степени, что, например, только более короткая форма (timeval tv) была бы допустимым синтаксисом в C #.

10 голосов
/ 08 декабря 2011

Я бы сказал, что это проектное решение для обоих языков.

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

C ++ имеет ctors и перегрузки операторов, поэтому они действуют как типы.

struct foo x;         // create a structure of pattern foo
typedef foo foo_type; // "define" a type
foo_type x;           // create an instance of type foo_type

C ++:

foo x; // create an instance of type foo

Как примечание, struct foo по-прежнемуразрешено в C ++.struct foo легче разобрать, чем typedef'd foo, так как поиск по имени проще.

8 голосов
/ 08 декабря 2011

Это просто как С выглядит.Поэтому следующие шаблоны довольно распространены в C:

typedef struct YourStructure
{
   int x;
   // more fields
} YourStructure;

Тогда вы можете ссылаться на него так же, как в C ++.

7 голосов
/ 08 декабря 2011

Это просто разница в языках.C ++ более разрешительный в своем структурном синтаксисе.

3 голосов
/ 08 декабря 2011

Конечно, С первым сделал это.Структуры и классы в C ++ почти идентичны, и было бы очень неудобно требовать class с каждой переменной класса, поэтому это было упрощено для обоих.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...