Зачем писать ключевое слово struct в объявлении указателя?

struct bal {
    float balance;
    char name[80];
} person;

struct bal *p=&person;

Зачем писать ключевое слово struct? Почему нельзя написать:

bal *p=&person;

Ведь мы создали и определили отдельный тип bal.

Я понимаю, что у меня каша в голове, но разъясните, пожалуйста, как есть.


Ответы (1 шт):

Автор решения: αλεχολυτ

В большинстве случаев писать struct или class перед типом определяемой переменной не требуется. В Си явное написание struct является необходимым, в C++ можно этим воспользоваться, но обязательного требования нет.

Есть, например, такое исключение. Когда имя класса совпадает с именем функции, то при объявлении объекта нужно указывать ключевое слово struct (или class):

struct F {};

void F() {}

int main() {
    F f;        // ошибка
    struct F f; // ok
}

Ещё один вариант, если мы совмещаем предварительное объявление класса с определением переменной:

struct F* f1; // т.к. F ещё не объявлен, то нужно добавить struct (или class)
F* f2;        // ошибка

struct F {};  // ниже этого объявления struct уже не является обязательным

F* f3;        // ok
struct F* f4; // тоже ok

int main() { }
→ Ссылка