Предположим, что у меня есть настройка, подобная 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