Почему это не генерирует дубликаты символов для компоновщика? - PullRequest
1 голос
/ 20 июня 2019

Давайте предположим следующий код:

// IInterface.h

#pragma once

class IInterface
{
  public:
  struct Thing
  {
    // If i uncomment this line, I can see that all object files increase in size.
    // char data[10240];
    int getOne() { return 1;}
  };
  // The interface doesn't really matter
};

// Derived1.h
#pragma once
#include "IInterface.h"

class Der1: public IInterface
{
  public:
  int getOne();
};

// Derived2.h
#pragma once
#include "IInterface.h"

class Der2: public IInterface
{
  public:
  int getOne();
};

// Derived1.cpp
#include "Derived1.h"

int Derived1::getOne()
{
  Thing thing;
  return thing.getOne();
}

// Derived2.cpp
#include "Derived2.h"

int Derived2::getOne()
{
  Thing thing;
  return thing.getOne();
}

// main.cpp

// Not really needed I guess?

#include "Derived1.h"
#include "Derived2.h"

int main(int argc, char* argv[])
{
  Der1 der1;
  Der2 der2;

  return der1.getOne() - der2.getOne();
}

Теперь яЯ не уверен, как задать этот вопрос словам, но здесь я иду.

Почему метод IInterface :: Thing :: getOne не генерирует ошибки компоновщика, потому что он имеет несколько версий в разных единицах перевода?

Если бы я сделал версию, в которой getOne - это просто глобальная функция, объявленная и определенная в IInterface.h, это вызвало бы ошибки компоновщика.

Я знаю, что мог бы переместить структуру в отдельную.файл cpp, но так как это IInterface и я использую C ++ 17, мне не нужен файл .cpp.Нет.

О, и я нахожусь на MSVC 2019. Но мне интересно, работает ли этот код для GCC или других компиляторов.Мне придется провести несколько тестов.

1 Ответ

0 голосов
/ 20 июня 2019

Чтение превосходной статьи gudok , которую вы должны прочитать, если вы не знакомы, заставляет меня теперь посмотреть, что происходит.

Так что дело в том, что метод Thing :: getOne встроен по умолчанию (потому что он определен и объявлен в заголовке). Встроенные, но не расширенные методы отмечены как слабые ссылки. И это конец.

...