Уважаемые коллеги, есть у меня основной файл - "test.cpp":
#include "pch.h"
#include <common.h>
#include "String.h" // Здесь определяется мой класс строки
int main()
{
double d = 12.536;
double r = common::round(d);
return 0x0000;
}
Файл "common.h" - это мой собственный заголовочный файл:
#pragma once
#ifndef COMMON_h
#define COMMON_h
namespace common
{
double round(double val, unsigned precision = 0);
}
#endif
Этот файл лежит где-то на диске D:\, и в компиляторе я в свойствах проектах добавил директорию поиска включаемых файлов. Он его прекрасно находит, но при сборке приложения выдаёт ошибку LNK2019. Рядом с этим файлом в той же директории лежит "common.cpp":
#pragma once
#include <common.h>
double common::round(double val, int precision)
{
/// Тут какой-то код
return 0.0;
}
Если я помещаю реализацию метода round() внутрь файла "common.h", то всё работает нормально, но только если я единожды подключаю этот файл. А вот если я его включу и в основной "test.cpp" и в "String.h", то уже выкидывает ошибку LNK2005. Подскажите, пожалуйста, как мне решить эту проблему. Заранее спасибо :)
externлинковка. Аinlineфункции являются вполне себе обычными функциями и наличие этого спецификатора ничего не говорит о том, будет ли эта функция реально встраиваться в место вызова или нет. – user7860670 Oct 04 '18 at 20:44inlineфункциях. Указаниеinlineявляется лишь рекомендацией для компилятора. Если функция не встроилась в код, а создалась функция, то она помечается weak символом в объектном файле. Как только компоновщик найдет один из weak символов, остальные будут проигнорированы. Даже если компилятор проигнорирует модификатор, компоновка пройдет успешно. Смело можно ставить встраиваемую функцию в один *.h-файл и использовать его в различных единицах трансляции. Нужно обновить ответ. Спасибо! :) – Alexnader Yashkin Oct 05 '18 at 08:48