несколько определений встроенной функции в 2 или более TU - PullRequest
0 голосов
/ 12 июня 2019

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

Итак, я подумал, что если я объявил в заголовочном файле функцию и определил ее в 2 файлах cpp как inline, компилятор не разозлился бы.

Поэтому я попытался сделать следующее:

global.h

#ifndef DRAKOS_GLOBAL_H
#define DRAKOS_GLOBAL_H

#include <iostream>
void fct();

#endif //DRAKOS_GLOBAL_H

file1.cpp

#include "global.h"

inline void  fct()
{
    std::cout << "file1.cpp \n";
}

main.cpp

#include "global.h"

extern void fct();

int main()
{
    fct();
}

Построение ---> Ошибка:

неопределенная ссылка на `fct () '

Хорошо, я посмотрел в Google и прочитал, что

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

До сих пор все понятно и логично, но вопрос в том, помещу ли я определение в заголовочный файл; у каждого TU будет одно и то же определение, я не смогу определить две версии встроенной функции, скажем, одну в TU file1.cpp, а вторую - в main.cpp.

Итак, вопрос 1: почему они говорят, что для встроенной функции могут иметь определения множественных значений в разных TU, но они должны быть одинаковыми (как если бы я поместил определение в заголовок, оно будет и не может быть другим в cpp файл)

вопрос 2: Если это возможно сделать и определить несколько определений встроенной функции (из-за неправильного понимания с моей стороны), может быть, кто-то из них, PLZ, покажет простой пример:)

Заранее спасибо

1 Ответ

2 голосов
/ 12 июня 2019

Этот код вызывает неопределенное поведение (диагностика не требуется) из-за правила C ++ 17 [dcl.inline] / 6:

[...] Если функция или переменная с внешней связьюобъявляется inline в одной единице перевода, она объявляется inline во всех единицах перевода, в которых она появляется;Диагностика не требуется.

Вы объявили fct встроенным в file1.cpp, но не в main.cpp.

Также у вас нет определения для fct в main.cpp.Вы могли бы скопировать и вставить в main.cpp (и все остальные .cpp в проекте):

inline void  fct()
{
    std::cout << "file1.cpp \n";
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...