Nano Hash - криптовалюты, майнинг, программирование

Глупые проблемы со связыванием C++ в GCC

Извините за неконкретный заголовок вопроса. Короче, вот что у меня есть:

файл1.cpp

#include "file1.h"

int main()
{
    somefunc();
}

файл1.h

#pragma once
#include "file2.h"

int somevar;

file2.cpp

#include "file2.h"

void somefunc()
{}

файл2.h

#pragma once
#include "file1.h"

void somefunc();

Это хорошо компилируется с GCC, но дает мне «multiple definition of somevar» во время компоновки.

Что не так?

12.07.2013

  • это может дать ошибку компилятора, когда вы удаляете #pragma один раз 12.07.2013
  • @Арьябхата Не имеет отношения. 12.07.2013

Ответы:


1

Вы определяете somevar в нескольких файлах, включая файл заголовка, содержащий его определение, в несколько файлов .cpp. Объявите его как extern int somevar; в заголовке и определите только в одном файле .cpp.

12.07.2013
  • Я думал, что #pragma once или, возможно, добавление охраны поможет. 12.07.2013
  • @PetruDimitriu Вы неправильно понимаете, что делают #pragma once и включают охранников. Они не позволяют включать один и тот же файл заголовка несколько раз в одну и ту же единицу перевода (файл .cpp). Они не могут, не могут и не должны мешать вам включать его в несколько разных файлов .cpp, что в данном случае вызывает проблему. 12.07.2013
  • Но что, если у меня есть несколько десятков cpp и h, которые зависят друг от друга, и объявление extern только ухудшит ситуацию? 12.07.2013
  • @PetruDimitriu Вы все еще включаете заголовочный файл. Но у вас только extern int somevar; в заголовке. У вас есть int somevar; только в одном файле cpp. 12.07.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..