Почему определения функций друга не экспортируются?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему определения функций друга не экспортируются?

Сообщение Anonymous »

Предположим, что у меня есть настройка, подобная SO (ссылка Godbolt): < /p>

Код: Выделить всё

// header.h
#pragma once

int g(int val);
< /code>
// main.cpp
#include "header.h"

int main() {
return g(1);
}
< /code>
// g.cpp
#include "header.h"

class C {
/*[[gnu::used]]*/ friend int g(int val) {
return val;
}
};

Если я компилируюсь g.cpp to g.o и main.cpp to main.o , и попытаться связать их, я получаю следующую ошибку линкера:

Код: Выделить всё

main.cpp:5:(.text+0xa): undefined reference to `g(int)'
Добавление атрибута [[GNU :: используется]]] к определению g в g.cpp Исправляет проблему. g.o , если мы явно не говорим об этом с [[GNU :: используется]] . (Но если бы мы просто написали g в качестве регулярного определения функции в G.cpp , а не друг, компилятор включил бы ее в G.O , и не будет ошибки линкера.) Есть ли что -то в стандарте, влияющее на то, считается ли такое определение друга доступным, что вызывает это, или это просто деталь реализации?

Подробнее здесь: https://stackoverflow.com/questions/796 ... t-exported
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»