Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Зачем нужен inline - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Б деревья http://www.cyberforum.ru/cpp-beginners/thread54823.html
Условие: текст программы вводится из файла.Используя бинарное дерево поиска выделить подсветкой зарезервированные слова.Что нужно вообще делать???
C++ сортировка шелла помогите с задачей масив 10000 елементов , упорядочить его отрицательные значения по увеличениию, посчитать количество сравнений и перестановок. Результаты внести в текстовый фаил. http://www.cyberforum.ru/cpp-beginners/thread54813.html
Новое окно программы! C++
Добрый вечер. Я в замешательстве. Надо написать программу по созданию тестов и оболочки по их прохождению. Столкнулся с немыслимой проблемой. Вот я создаю проект.. добавляю в него форму. на форме две...
C++ С++ - Считывание из файла в фаил )
Всем приветь.Парюсь дальше: #include <fstream> #include <conio.h> #include <stdio.h> #include <iostream> using namespace std;
C++ Программа Text Viewer (WIN API) http://www.cyberforum.ru/cpp-beginners/thread54757.html
Добрый день, у меня такая проблема: я делаю простую программу для просмотра текста, при компиляции выдается ошибка, что hWnd не объявлена, хотя она объявлялась в KWnd.h Как думаете, где ошибся? ...
C++ Построчный вывод файла #include <conio.h> #include <stdio.h> #include <iostream> int main() { FILE *fp; char res; char *x; подробнее

Показать сообщение отдельно
Evg
Эксперт CАвтор FAQ
17809 / 6015 / 388
Регистрация: 30.03.2009
Сообщений: 16,531
Записей в блоге: 26
07.10.2009, 14:08
Цитата Сообщение от Syltan Посмотреть сообщение
Хорошо,скажите что такое weak и всё?
Атрибут символьной ссылки в бинарном файле. Забей, всё равно не поймёшь. Для тебя важно лишь то, что функция с модификатором inline может быть определена несколько раз и от этого не будет ошибок на линковке. Грубо говоря

C++
1
2
3
/* Файл t1.cc */
inline void func (void) { }
int main (void) { return 0; }
C++
1
2
/* Файл t2.cc */
inline void func (void) { }
Далее компиляешь эти два файла вместе и у тебя успешно всё проходит. Теперь убери модификатор inline и у тебя призойдёт слом на линковке. На пальцах из всего этого сентенция такая, что ты можешь писать inline функции в заголовочных файлах (*.h). Сие свойство было признано прийти на замену макросам в Си

==========================================================

Пример. Сделать быстрый интферфейс для вычисления квадрата числа

На Си этот вариант выглядел бы так:

C
1
2
/* Файл t.h */
#define SQR(x) ((x)*(x))
C
1
2
3
4
5
6
7
8
9
10
/* Файл t.c */
#include "t.h"
 
void func (void)
{
  int x, y;
  ...
  x = SQR (y);
  ...
}
При этом использование макроса даёт побочный эффект в тех случаях, когда аргумент являеет НЕреентрабельным (т.е. каждое обращение к аргументу может менять его значение). Например, нижеследующий код с такми вариантом построения макроса SQR отработает некоректно

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* Файл t.c */
#include "t.h"
 
static int a = 1;
int f1 (void)
{
  return a++;
}
 
void func (void)
{
  int x;
  x = SQR (f1());
}
а вот если написать вот так, то тогда будет работать правильно:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* Файл t.c */
#include "t.h"
 
static int a = 1;
int f1 (void)
{
  return a++;
}
 
void func (void)
{
  int x, tmp;
  tmp = f1();
  x = SQR (tmp);
}
Приразработке языка Си++ авторы постарались учесть сие неудобство и в качестве решения предложили использовать inline-функции. Работа с ними уже не вызывает побочных эффектов. В случае Си++ файл t.h следует написать вот так:

C++
1
2
3
4
5
/* Файл t.h */
inline int SQR (int x)
{
  return x * x;
}
В этом случае компилятор сам вправе решать, делать ему inline-подстановку, или не делать. Если не делать, то всё равно код остаётся корректным и не будет конфликтовать сдругими моулями, где компилятор так же решил НЕ делать подставноку. Итого, хоть мы и имеем функцию, но работать она будет так же быстро, как и макрос (естественно, считаем, что компилятор работает адекватно)

Вышеописанный вариант SQR в виде inline-функции более правильно делать в виде шаблона, чтобы так же как и макрос работало для произвольных типов. Но я просто привёл пример для демонстрации того, как этим пользоваться. Надо заметить, что техническая реализация инстанциации шаблонной функции в компиляторе выполняется точно так же, как и для функции с модификатором inline, именно поэтому не возникает конфликтов при линковке
9
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru