Проблема с многофайловым проектом в С++

Возникла проблема с многофайловым проектом, выдаёт ошибку. введите сюда описание изображения

Что бы не пытался делать никак не получается от нее избавиться и сделать так, чтобы функция в основном файле заработала. Подскажите, пожалуйста, в чем загвоздка.

main.cpp :

  #include <iostream>
#include <ctime>
using namespace std;
#define N 10
#include "qw.h"

int main() {

    setlocale(LC_ALL, "ru");
    zapoln(mm);

qa.cpp :

#include "qw.h"
#include <iostream>
void zapoln(mon mm[])
{
    int ne;
    double sqx;
    for (ne = 0; ne < 3; ne++) {
        printf("%d. Введите: название, школу, количество, площадь >",
            ne + 1);
        scanf_s("%s", mm[ne].name, sizeof(mm[ne].name));
        if (!strcmp(mm[ne].name, "***")) break;
        scanf_s("%f", &mm[ne].sc, sizeof(mm[ne].name));
        scanf_s("%f", &mm[ne].cnt);

        scanf_s("%lf", &sqx); mm[ne].sq = sqx;
    }
}

qw.h :

#pragma once

#ifndef _QW_H_
#define _QW_H_
struct mon {
    char name[35];
    float sc;
    float cnt;
    double sq;
}mm[45];
void zapoln(mon mm[]);
#endif

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

Автор решения: Harry

По-моему, вы не с того конца заходите. У вас вопрос "почему это машина не развивает 100 км/ч" - при том, что она не только не заводится, но ее вообще нет.

При компиляции вы должны были получить сообщение об ошибке

LNK1169: обнаружен многократно определенный символ - один или более

потому что переменная mm у вас определена в заголовочном файле, включенном в два .cpp-файла. И линковщик понятия не имеет, какую оставить :)

Варианты решений (если у вас и в самом деле С++, уж очень вы работаете в духе C - одно объявление переменной цикла вне его чего стоит...) -

Объявить mm как inline.

inline struct mon {
    char name[35];
    float sc;
    float cnt;
    double sq;
}mm[45];

Объявить mm как extern, и определить в файле .cpp

// qw.h
extern struct mon {
    char name[35];
    float sc;
    float cnt;
    double sq;
}mm[45];

// main.cpp
struct mon {
    char name[35];
    float sc;
    float cnt;
    double sq;
}mm[45];

Поступить, как принято - объявить в заголовочном файле тип, а переменную - в .cpp:

// qw.h
struct mon {
    char name[35];
    float sc;
    float cnt;
    double sq;
};

// main.cpp
mon mm[45];

Потом у вас возникнут другие вопросы, но это уж потом...

→ Ссылка