56

Вопрос по c++ – ошибка LNK2005, уже определена?

У меня есть 2 файла, A.cpp и B.cpp, в консольном приложении Win32.

Оба 2 файла содержат только следующие 2 строки кода:

#include "stdafx.h"
int k;

При компиляции выдает ошибку

Error   1   error LNK2005: "int k" ([email protected]@3HA) already defined in A.obj

Я не понимаю, что происходит.

Может кто-нибудь, пожалуйста, объясните мне это?

  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit ExceededdefiningError: User Rate Limit Exceededint k = 0;Error: User Rate Limit ExceededheaderError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit ExceededonlyError: User Rate Limit ExceededonceError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceededextern)?

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceededextern, kError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • T & T Group? Это название вашей компании? Я бы не рекомендовал подписываться под названием вашей компании, когда вы задаете основные вопросы. Особенно, если ваши клиенты ожидают от вас защиты их информации.

    от CodyBugstein
  • Hint for fellas: пропавший#include "stdafx.h" источник этой ошибки тоже.

    от Bitterblue
7 ответов
  • 3

    И если вы хотите

    чтобы эти единицы перевода использовали эту переменную, определитеint k; в A.cpp и положилextern int k; в B.cpp.

  • 6

    Оба файла определяют переменную

    k как целое число (int).

    В результате компоновщик видит две переменные с одним и тем же именем и не уверен, какую из них использовать, если вы когда-либо ссылаетесь наk.

    Чтобы исправить это, изменитеone из объявлений:

    extern int k;
    

    Это означает:"k is an integer, declared here, but defined externally (ie. the other file)."

    Теперь есть только одна переменнаяk, что может быть правильно указано в двух разных файлах.

  • 1

    Линкер сообщает, что у вас есть переменная

    k определяется несколько раз. Действительно, у вас есть определение в A.cpp и другое в B.cpp. Оба модуля компиляции создают соответствующий объектный файл, который компоновщик использует для создания вашей программы. Проблема в том, что в вашем случае компоновщик не знает, какое определениеk использовать. В C ++ вы можете иметь только одно определение одной и той же конструкции (переменная, тип, функция).

    Чтобы это исправить, вам нужно решить, какова ваша цель

    If you want to have two variables, both named k, you can use an anonymous namespace in both .cpp files, then refer to k as you are doing now:

    .

    namespace {
      int k;
    }
    
    You can rename one of the ks to something else, thus avoiding the duplicate defintion. If you want to have only once definition of k and use that in both .cpp files, you need to declare in one as extern int k;, and leave it as it is in the other. This will tell the linker to use the one definition (the unchanged version) in both cases -- extern implies that the variable is defined in another compilation unit.

  • 6

    Предполагая, что вы хотите &

    k; чтобы иметь разные значения в разных файлах .cpp (следовательно, объявив его дважды), попробуйте изменить оба файла на

    namespace {
        int k;
    }
    

    Это гарантирует, что название «k» однозначно идентифицирует «k» через переводческие единицы. Старая версияstatic int k; устарела.

    Если вы хотите, чтобы они указывали на одно и то же значение, измените его наextern int k;.

  • 87

    Why this error?

    Вы сломалиодно определение правила и, следовательно, ошибка компоновки.

    Suggested Solutions:

    Если вам нужна одинаковая именованная переменная в двух файлах cpp, то вам нужно использовать безымянное пространство имен (Anonymous Namespace), чтобы избежать ошибки.

    namespace 
    {
        int k;
    }
    

    Если вам нужно использовать одну и ту же переменную в нескольких файлах, вам нужно использоватьextern.

    A.h

    extern int k;
    

    A.cpp

    #include "A.h"
    int k = 0;
    

    B.cpp

    #include "A.h"
    
    //Use `k` anywhere in the file 
    

  • 67

    добавьте / FORCE: MULTIPLE к параметрам командной строки компоновщика.

    ОтMSDN: & quot; Используйте / FORCE: MULTIPLE, чтобы создать выходной файл независимо от того, найдет ли LINK несколько определений для символа. & quot;

  • 13

    Если вы хотите

    чтобы оба ссылались на одну и ту же переменную, один из них должен иметьint k;, а другой должен иметьextern int k;

    Для этой ситуации вы обычно ставите определение (int k;) в одной.cpp файл, и положить объявление (extern int k;) в заголовке, который будет включен везде, где вам нужен доступ к этой переменной.

    , чтобы каждыйk чтобы быть отдельной переменной, которая просто имеет одно и то же имя, вы можете пометить их какstatic, лайк:static int k; (во всех файлах или, по крайней мере, во всех, кроме одного файла). Кроме того, вы можете использовать анонимное пространство имен:

    namespace { 
       int k;
    };
    

    Опять же, во всех, но не более одного файла.

    В Си компилятор обычно не так разборчив в этом. В частности, C имеет понятие «предварительное определение», так что если у вас есть что-то вродеint k; дважды (в одном и том же или в отдельных исходных файлах) каждый будет рассматриваться как предварительное определение, и между ними не будет конфликта. Однако это может немного сбивать с толку, поскольку у вас по-прежнему не может быть двух определений, которые оба содержат инициализаторы - определение с инициализатором всегда является полным определением, а не предварительным определением. Другими словами,int k = 1; появление дважды будет ошибкой, ноint k; в одном месте иint k = 1; по другому не будет. В этом случаеint k; будет рассматриваться как предварительное определение иint k = 1; как определение (и оба ссылаются на одну и ту же переменную).