Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> определение функции в классе 
V
    Опции темы
17dufa
Дата 2.11.2009, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 2.3.2006

Репутация: 3
Всего: 5



Добрый день.
Собственно интересует такой вопрос - а почему на определенные в рамках класса функции не ругается линкер, что они already defined? это просто требование стандарта или такое определение чем-то концептуально отличается от определения просто функции?
то есть вот такое линкуется
Код

//A.h
class A
{
public:
int f(int i)
{
return ++i;
}
};
//1.cpp
#include "A.h"
....
//2.cpp
#include "A.h"
.....

а вот такое нет
Код

//A.h
int f(int i)
{
return ++i;
}
//1.cpp
#include "A.h"
....
//2.cpp
#include "A.h"
....

*ну и то же самое для
Код

//A.h
class A
{
public:
int f(int i);
};
int A::f(int i)
{
return ++i;
}
//1.cpp
#include "A.h"
....
//2.cpp
#include "A.h"
....

PM MAIL   Вверх
Alek86
Дата 2.11.2009, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



насколько я помню, функции, реализованные внутри класса, считаются inline
если во втором случае ты перед функцией int f(int i) напишешь слово inline, то он тоже будет линковаться


--------------------
user posted image    user posted image
PM MAIL   Вверх
17dufa
Дата 2.11.2009, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 2.3.2006

Репутация: 3
Всего: 5



Alek86, точно. никак не мог подумать, что inline влияет на линковку, хотя это закономерно, если с минуту поразмышлять.
PM MAIL   Вверх
azesmcar
Дата 2.11.2009, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Alek86,
правильно помнишь.

Цитата

A member function may be defined (8.4) in its class definition, in which case it is an inline member function
(7.1.2), or it may be defined outside of its class definition if it has already been declared but not
defined in its class definition.


Цитата

An inline function shall be defined in every translation unit in which it is used and shall have exactly the
same definition in every case (3.2)


PM   Вверх
FCM
Дата 2.11.2009, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Цитата(azesmcar @  2.11.2009,  10:59 Найти цитируемый пост)
An inline function shall be defined in every translation unit in which it is used and shall have exactly the
same definition in every case (3.2)


Но компилятор (Microsoft) не будет ругаться, если в двух единицах трансляции определены две одноименные inline функции с одинаковым прототипом (declaration), но  с разными реализациями (definition). У них же разные области видимости. 
Некорректности проявляются только на этапе выполнения такой программы.

PM MAIL   Вверх
azesmcar
Дата 2.11.2009, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(FCM @  2.11.2009,  15:09 Найти цитируемый пост)
Но компилятор (Microsoft) не будет ругаться, если в двух единицах трансляции определены две одноименные inline функции с одинаковым прототипом (declaration), но  с разными реализациями (definition). У них же разные области видимости. 
Некорректности проявляются только на этапе выполнения такой программы.

1. То, что микрософт не ругается еще ни о чем не говорит.
2. Это не отменяет вышесказанного.
PM   Вверх
FCM
Дата 2.11.2009, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Но все-таки inline-функции не обладают внешними связями и не могут непосредственно видеть друг друга (если определены в разных единицах трансляции), или я ошибаюсь?

Это сообщение отредактировал(а) FCM - 2.11.2009, 15:29
PM MAIL   Вверх
azesmcar
Дата 2.11.2009, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(FCM @  2.11.2009,  15:28 Найти цитируемый пост)
Но все-таки inline-функции не обладают внешними связями и не могут непосредственно видеть друг друга (если определены в разных единицах трансляции), или я ошибаюсь?


инлайн функции ДОЛЖНЫ быть определены во всех единицах трансляции, в которых они используются и если функция со вшешним связыванием объявлена инлайн - она должна быть объявлена инлайн во всех единицах трансляции, в которых используется. А само ключевое слово инлайн на linkage функции никак не влияет.
PM   Вверх
17dufa
Дата 2.11.2009, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 2.3.2006

Репутация: 3
Всего: 5



azesmcar, "А само ключевое слово инлайн на linkage функции никак не влияет." Можно подробнее? Я, к сожалению, ни слова не понял.
PM MAIL   Вверх
bsa
Дата 2.11.2009, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



FCM, ключевое слово "inline" - это всего лишь рекомендация компилятору и указание, что данная функция может быть определена в нескольких единицах трансляции. Т.е. если ты пометил функцию встраиваемой, это совсем не значит, что она будет встроена (особенно, в режиме отключенной оптимизации).
PM   Вверх
azesmcar
Дата 2.11.2009, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



17dufa

про linkage
http://www.cyberguru.ru/programming/cpp/cp...way-page25.html

Добавлено через 1 минуту и 40 секунд
Цитата(bsa @  2.11.2009,  15:48 Найти цитируемый пост)
Т.е. если ты пометил функцию встраиваемой, это совсем не значит, что она будет встроена (особенно, в режиме отключенной оптимизации). 

более того, даже если она будет встраиваемой в одном участке кода, это не значит что она встраиваемая всегда. Встраивается вызов функции.
PM   Вверх
17dufa
Дата 2.11.2009, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 2.3.2006

Репутация: 3
Всего: 5



azesmcar,  несколько вопросов: 
1. inline и внешнее/динамическое связывание - это как? 
2. возвращаясь к первому вопросу, если компилятор положит на inline и таки сгенерит функцию, вернутся ошибки линковки или компилятор будет генерить функцию очень специальным образом?
PM MAIL   Вверх
azesmcar
Дата 2.11.2009, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(17dufa @  2.11.2009,  15:58 Найти цитируемый пост)
1. inline и внешнее/динамическое связывание - это как? 

В каком смысле? Обыкновенная функция со внешним связыванием, просто с ключевым словом inline. Я же говорю, инлайн с linkage никак не влияет.
Цитата

The inline keyword has no effect on the linkage of a function


Цитата(17dufa @  2.11.2009,  15:58 Найти цитируемый пост)
2. возвращаясь к первому вопросу, если компилятор положит на inline и таки сгенерит функцию, вернутся ошибки линковки или компилятор будет генерить функцию очень специальным образом? 

нет, ошибок не будет

http://forum.vingrad.ru/forum/topic-275681...tion/index.html
последние 3 сообщения.


Это сообщение отредактировал(а) azesmcar - 2.11.2009, 16:55
PM   Вверх
FCM
Дата 2.11.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



В этих последних 3-х сообщениях есть такие слова
"Однако при помощи inline можно влиять на способ компоновки."
Это утверждение ошибочно ?

И еще "инлайн функции не подчиняются ему (OneDefinitionRule)".
Это так?
PM MAIL   Вверх
bsa
Дата 2.11.2009, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



проще говоря, если компилятор видит inline функцию, то он обрабатывает ее обычным образом, плюс, в тех местах, где считает необходимым, он встраивает ее тело вместо вызова...
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0556 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.