Подтвердить что ты не робот

Почему 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 на таких строках всегда несколько сбивало меня с толку).

4b9b3361

Ответ 1

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

Если есть двусмысленность, также С++ требует ключевое слово 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 с каждой переменной класса, чтобы было упрощено для обоих.