внутр. компоновка
От: Lorenzo_LAMAS  
Дата: 21.02.03 06:17
Оценка:
В стандарте сказано, что функция, впервые объявленная другом, имеет внешнюю компоновку. Что происходит, если я пишу
//cl.h
class A{
    friend void fun();//так как по аргументам функцию не найти, то я ее могу
//теперь спрятать в какой-то единице трансляции, задав ей статическую
//компоновку
};
//some_cpp.cpp
#include “cl.h”
static void fun(){
///
}

Другом будет эта fun с внутренне компоновкой? А что произойдет, если я объявлю функцию не static, а в безымянном namespace?
Of course, the code must be complete enough to compile and link.
Re: внутр. компоновка
От: Lorenzo_LAMAS  
Дата: 21.02.03 10:31
Оценка:
LL>
LL>//cl.h
LL>class A{
LL>    friend void fun();//так как по аргументам функцию не найти, то я ее могу
LL>//теперь спрятать в какой-то единице трансляции, задав ей статическую
LL>//компоновку
LL>};
LL>//some_cpp.cpp
LL>#include “cl.h”
LL>static void fun(){
LL>///
LL>}
LL>

Я так понял, что это будет ошибкой из-за несоответствия компоновок. Но как же в случае с unnamed namespace? Объявление друга относится к функции, которая не в нем (глобальной)?
Of course, the code must be complete enough to compile and link.
Re: внутр. компоновка
От: ruslan_abdikeev Россия http://aruslan.nm.ru
Дата: 21.02.03 10:41
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

LL>В стандарте сказано, что функция, впервые объявленная другом, имеет внешнюю компоновку. Что происходит, если я пишу

LL>
LL>//cl.h
LL>class A{
LL>    friend void fun();//так как по аргументам функцию не найти, то я ее могу
LL>//теперь спрятать в какой-то единице трансляции, задав ей статическую
LL>//компоновку
LL>};
LL>//some_cpp.cpp
LL>#include “cl.h”
LL>static void fun(){

Это ошибка: одно и то же имя не может одновременно иметь internal и external linkage.

LL>///
LL>}
LL>

LL>Другом будет эта fun с внутренне компоновкой?

Нет. Код некорректен.

LL>А что произойдет, если я объявлю функцию не static, а в безымянном namespace?


Это будет просто функция в безымянном namespace.
А вот функция, объявленная в глобальном namespace и будет другом.

Руслан
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.