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

Встраивание результата функции в место ее вызова - C++

Восстановить пароль Регистрация
 
 
remix.remix
Сообщений: n/a
04.09.2012, 01:01     Встраивание результата функции в место ее вызова #1
Здравствуйте. Можно ли как-то реализовать чтобы перед компиляцией программы выполнолась функция, а ее результат встраивался в место ее вызова? Знаю что для фунций есть классификатор inline, но тогда в место вызова встраивается сама функция, а мне нужен именно результат. Например:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void func(int i)
{
if(i==1)
n = 1;
else
n = 0;
}
 
int main(void)
{
int i = 1;
func(i);
}
И вот нужно, чтобы при компиляции вместо "func(i);" стояло "n = 1;".
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2012, 01:01     Встраивание результата функции в место ее вызова
Посмотрите здесь:

C++ Ошибка вызова шаблонной функции
Функции. Синтаксис объявления и вызова C++
C++ Абстракция вызова функции
оформить решение в виде функции следующими способами: 1. функция расположена после ее вызова; 2. функция расположена после до ее вызова; 3. функ C++
C++ нужно чтобы функция располагалась до ее вызова, после ее вызова и в другом файле. Как это сделать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.09.2012, 01:16     Встраивание результата функции в место ее вызова #2
Сразу напомнию: надеюсь, вы понимаете, что если в функцию передаётся не константа, то это невыполнимо в принципе.

Надёжный способ для Си++ есть только один: шаблонная магия. Это позволит рассчитать нужное значение при компиляции и подставить его в нужное место. Но выглядит она не особо ахти даже для такого простого случая: Func<n> = 0 для чётных и 1 для нечётных чисел.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
template <int N>
struct Func {
  const static int value = N % 2 ? 1 : 0;
  // но это ещё просто, так как всё влазит в одно полное выражение
  // если надо что-то сложнее, то только рекурсией на шаблонах
};
 
int main()
{
  std::cout << Func<1>::value << " "
            << Func<2>::value << " "
            << Func<3>::value << " "
            << Func<4>::value;
}
Шаблоны раскрываются при компиляции, так что значение точно вычисляется при компиляции. Подставляется прямиком оно не гарантированно, но наверняка (читайте дальше).

Чем сложнее функция, тем больше придётся писать этой магии. Но чисто принципиально можно так вычислить любую функцию. Вот только запись будет сложной.


Ненадёжный способ: компиляторы обычно выполняют свёртку констант и если им удаётся что-то вычислить сразу же, они это сделают и подставят. То же самое с константами:
const int n = 10;
Все обращения к n чаще всего будут заменены сразу же на её значение.

Но заставить компилятор делать это нельзя. Можно только подсказать и попросить, но решать, выполнять или нет подстановку, он будет сам. Вон тот ваш вызов можно вычислить при компиляции, но не факт, что компилятор это увидит и сделает.


В Си++ нет нормальной макросистемы, чтобы удобно делать вот такие гарантированные раскрытия кода при компиляции. Есть только шаблоны.
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
04.09.2012, 16:04     Встраивание результата функции в место ее вызова #3
~OhMyGodSoLong~, Постойте! а как-же макросы? #define и поехали! в принципе то-же самое, если константа, то будет вычислено, иначе нет.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
04.09.2012, 16:35     Встраивание результата функции в место ее вызова #4
а зачем вообще компилятор, программа, ...? уже все посчитано...
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
04.09.2012, 16:37     Встраивание результата функции в место ее вызова #5
novi4ok,

Не по теме:

тсс! Это тайна проекта GNU! Все уже написано! Все уже решено!

ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.09.2012, 16:39     Встраивание результата функции в место ее вызова #6
Invader_Zim, #define в С++ используется редко и не по делу использовать не нужно. Здесь свободно можно обойтись константой, без каких-либо структур, функций, макросов.
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
04.09.2012, 16:41     Встраивание результата функции в место ее вызова #7
ForEveR, а если эту константу надо высчитать? один раз и на века? Может это зерно ключа? Ну или еще каке-то завороты в голове автора?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.09.2012, 16:43     Встраивание результата функции в место ее вызова #8
Invader_Zim, Шаблоны.
Или constexpr функция в С++11.
В любом случае не через #define.
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
04.09.2012, 16:49     Встраивание результата функции в место ее вызова #9
ForEveR, а почему нет? Если в макрос скинуть константу, то будет нужный ТС результат
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.09.2012, 16:51     Встраивание результата функции в место ее вызова #10
Invader_Zim, Потому что макросы не стоит использовать в С++ повсеместно. Да вообще практически не стоит. Потому что это С++. Язык высокого уровня. А #define - наследие от Си, препроцессор просто заменяет вхождение токенов, не зная ничего об областях видимости, типах и прочем. Везде, где можно обойтись без макросов - стоит обходится без них.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
04.09.2012, 16:53     Встраивание результата функции в место ее вызова #11
Цитата Сообщение от remix.remix Посмотреть сообщение
чтобы перед компиляцией программы выполнолась функция
это вообще как?
remix.remix, http://www.cyberforum.ru/cpp-experts/thread323714.html
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
04.09.2012, 16:56     Встраивание результата функции в место ее вызова #12
ForEveR, Согласен, это не типобезопасно, но это дело привычки. Кому что удобно. Мне например нравится ISO-C++ который 96 года. Больше не требуется. Там и так слишком много фич. ИМХО.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.09.2012, 17:14     Встраивание результата функции в место ее вызова #13
Прочитал про constexpr. Слава яйцам, теперь можно высчитывать compile-time вещи привычной императивщиной, а не эзотеричной шаблонной магией, оставив наконец шаблоны для обобщённого программирования.

Не по теме:

Invader_Zim, а я вообще в глубине души надеюсь что DSL победят концепцию "язык общего назначения + монструозные распухшие библиотеки, пытающиеся объять необъятное".

Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
04.09.2012, 17:53     Встраивание результата функции в место ее вызова #14
~OhMyGodSoLong~,

Не по теме:

А как-же няшка буст? Мыж его все любим!
и еще одно: что такое DSL?

Intel~lect
 Аватар для Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
04.09.2012, 18:19     Встраивание результата функции в место ее вызова #15
Цитата Сообщение от remix.remix Посмотреть сообщение
чтобы при компиляции вместо "func(i);" стояло "n = 1;".
Ну возьмите и напишите вместо этой функции n = 1; Что вам мешает?
Или какое другое значение. Сами рассчитайте во время написания программы и вставьте.
OhMyGodSoLong
04.09.2012, 18:31
  #16

Не по теме:

Цитата Сообщение от Invader_Zim Посмотреть сообщение
~OhMyGodSoLong~,

Не по теме:

А как-же няшка буст? Мыж его все любим!
и еще одно: что такое DSL?

Domain specific language. Небольшой специализированный язык в языке. Я не говорю, что библиотеки должны умереть. Просто я люблю синтаксический сахар, меня расстраивает втискивание абстракций в прокрустово ложе фиксированного синтаксиса и я не считаю, что выучить небольшой специализированный язык сложнее, чем интерфейс библиотеки. Няшка буст никуда не денется, просто будет записываться эстетичнее.

Но это так, розовая мечта.

Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
04.09.2012, 18:42     Встраивание результата функции в место ее вызова #17
~OhMyGodSoLong~,

Не по теме:

А разве все долно быть легко? Это настоящие герои всегда идут в обход, а мы...

ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.09.2012, 18:45     Встраивание результата функции в место ее вызова #18
Invader_Zim, Во-первых до 98 С++ не был стандартизирован. Во вторых практически все люди, пишущие что-то серьезное на С++ используют boost или другую библиотеку, которая не является стандартной.
Согласен, это не типобезопасно, но это дело привычки. Кому что удобно.
О нет, это не дело привычки, это дело того, что человек не знает возможностей С++ и пытается писать что-то, что можно написать на высоком уровне, дедовскими методами (читай Си). Вообще смешивать Си и С++ код считается крайне плохой практикой. Так что тут не в привычке дело, а в желании побыдлокодить.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
04.09.2012, 18:48     Встраивание результата функции в место ее вызова #19
Цитата Сообщение от remix.remix Посмотреть сообщение
И вот нужно, чтобы при компиляции вместо "func(i);" стояло "n = 1;".
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#define JA_GRISCHA!!!
...
void func(int i)
{
if(i==1)
n = 1;
else
n = 0;
}
 
int main(void)
{
int i = 1;
#ifdef JA_GRISHA!!!
n = 1;
#else
func(i);
#endif
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2012, 18:51     Встраивание результата функции в место ее вызова
Еще ссылки по теме:

Не понятный глюк вызова перегруженной функции C++
C++ Вызова функции
Упрощение вызова функции через #define C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
04.09.2012, 18:51     Встраивание результата функции в место ее вызова #20
ForEveR, У каждого свои взгляды на вопрос. И от буста я не открещиваюсь, сам его использую. Я знаю что чуть менее чем полностью буст состоит из шаблонов. но моего отношения к излиней абстракции это не меняет.

Добавлено через 1 минуту
novi4ok, не, не так
C
1
2
3
#define N 1
...
i=N

И я не буду отказываться от дефайнов! Ибо чуть менее чем весть кроссплатформенный код состоит из дефайн-салата
Yandex
Объявления
04.09.2012, 18:51     Встраивание результата функции в место ее вызова
Ответ Создать тему
Опции темы

Текущее время: 15:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru