Вопрос C о компоновщике и объявлениях нескольких классов

#c

Вопрос:

Итак, у меня есть файл под названием test.cpp

 class Entity
{
    int c = 0;
    int b = 0;
    int d = 5;

};
 

А потом позвонил еще один main.cpp

 #include<iostream>
#include<vector>
#include<algorithm>
class Entity
{

    int a = 5;
    int b = 0;


};
int main()
{
    
}
 

Почему эта ссылка и работает просто отлично? Разве компоновщик не видит, что существует 2 класса с одинаковыми именами и разными элементами данных? Также будут ли они рассматриваться как определения классов? Если бы я хотел объявить этот класс в заголовочном файле, я бы просто сделал то, что я сделал здесь, верно? Несмотря на то, что я технически определяю переменные, это все еще просто объявление класса, верно?..

Комментарии:

1. Классы на самом деле не существуют после того, как компилятор передал единицы преобразования компоновщику, только объекты.

2. С другой стороны, поскольку у вас есть разные определения класса в разных единицах перевода, ваша программа будет иметь неопределенное поведение .

3. Так что, я думаю, это считается определениями, но если я хочу создать класс из test.cpp как бы я это точно объявил в заголовочном файле?

4. Переместите полное определение из исходного файла в файл заголовка. Удалите определение во всех исходных файлах. Включите файл заголовка.

5. Но можно ли на самом деле указывать значения членов данных класса в объявлении? Потому что я чувствую, что если я это делаю, то это просто становится определением, например, если у меня есть класс class E { int a = 0; }; и просто поместите это в файл заголовка, это определение верно?

Ответ №1:

Это плохо сформированная программа.

Поскольку определение класса имеет внешнюю связь, то каждое определение класса должно состоять из одной и той же последовательности токенов.

С другой стороны, поскольку ни один код из единицы перевода test.cpp используется компоновщик, который может исключить его из конечного exe-файла.