Почему C требуется ключевое слово struct, а не С++?
Я всегда немного смущался о том, что происходит здесь:
#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 на таких строках всегда несколько сбивало меня с толку).
Ответы
Ответ 1
Синтаксически и лечить struct
почти то же самое. Только С++ добавил дополнительное правило, которое позволяет опустить ключевое слово struct
(и class
), если нет двусмысленности.
Если есть двусмысленность, также С++ требует ключевое слово struct
в некоторых местах. Известным примером является stat
в системах POSIX, где есть struct stat
и функция stat
.
Ответ 2
Я бы сказал, что это дизайнерское решение обоих языков.
Структуры в 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
С++:
foo x; // create an instance of type foo
Как побочная заметка, struct foo
по-прежнему разрешен в С++. struct foo
проще разбирать, затем typedef'd foo
, поскольку поиск по имени проще.
Ответ 3
Это просто разница в языках. С++ является более разрешительным в его синтаксисе структуры.
Ответ 4
Рассмотрим оригинальную идею С++ (или, когда это была просто идея "C с классами" ), язык OO-ориентированного языка, который был совместим с C до той точки, в которой были также действительны C-программы С++ программы.
С++ построил свою модель класса, начиная с C struct
и добавляя некоторые дополнительные функции:
- Наследование (хотя вы можете приблизиться к C, имея первый член структуры, который вы хотите "наследовать" ).
- Скрытие информации (через
public
, private
и т.д.)
- Методы членов (которые первоначально были переведены макросами в C-код за пределами структуры с добавленным параметром
this
- многие реализации на практике все еще схожи).
В этот момент возникли две проблемы. Во-первых, доступ по умолчанию должен быть общедоступным, поскольку C не скрывает информацию и, следовательно, с точки зрения С++ имеет все общедоступное. Для хорошего OO нужно по умолчанию закрыто. Это было решено добавлением class
, которое в значительной степени идентично struct
, за исключением значения по умолчанию private
, а не public
.
Другим является то, что эта перспектива OO должна иметь timeval
или любой другой класс/структуру на одной и той же "опоре" как int
или char
, а не постоянно комментировать в коде как специальный. Это было решено путем ослабления правила, которое нужно разместить struct
(или class
) перед именем типа при объявлении переменной этого типа. Следовательно, struct timeval tv
может стать timeval tv
.
Затем это повлияло на более поздние языки OO с синтаксисом C, такие как Java и С#, до тех пор, пока, например, в С# не будет синтаксис более короткой формы (timeval tv
).
Ответ 5
Это просто, как выглядит C. Поэтому следующие шаблоны довольно распространены в C:
typedef struct YourStructure
{
int x;
// more fields
} YourStructure;
Затем вы можете ссылаться на него так же, как на С++.
Ответ 6
Конечно, C это первый раз. Структуры и классы в С++ почти идентичны, и было бы очень неудобно требовать class
с каждой переменной класса, чтобы было упрощено для обоих.