Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
remix.remix
1

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

04.09.2012, 01:01. Показов 2057. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Можно ли как-то реализовать чтобы перед компиляцией программы выполнолась функция, а ее результат встраивался в место ее вызова? Знаю что для фунций есть классификатор 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;".
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.09.2012, 01:01
Ответы с готовыми решениями:

Место вызова
есть место вызова Работа, у пользователя при входе в Lotus показывает, что не выбрано место вызова...

Вывод на экран результата вызова ls
Есть задача вывести на экран результат программы. Суть программы в том что она повторяет функцию...

Возврат в место вызова подпрограммы
У меня есть вызов подпрограммы которая потом вызывает сама себя еще н-ое количество раз, возможно...

Переключить место вызова программно
Подскажите, пожалуйста, как переключить Место вызова (Расположение) программно??? Скажем,...

24
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 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 чаще всего будут заменены сразу же на её значение.

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


В Си++ нет нормальной макросистемы, чтобы удобно делать вот такие гарантированные раскрытия кода при компиляции. Есть только шаблоны.
1
Twilight Parasite
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
04.09.2012, 16:04 3
~OhMyGodSoLong~, Постойте! а как-же макросы? #define и поехали! в принципе то-же самое, если константа, то будет вычислено, иначе нет.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
04.09.2012, 16:35 4
а зачем вообще компилятор, программа, ...? уже все посчитано...
0
Twilight Parasite
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
04.09.2012, 16:37 5
novi4ok,

Не по теме:

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

0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.09.2012, 16:39 6
Invader_Zim, #define в С++ используется редко и не по делу использовать не нужно. Здесь свободно можно обойтись константой, без каких-либо структур, функций, макросов.
0
Twilight Parasite
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
04.09.2012, 16:41 7
ForEveR, а если эту константу надо высчитать? один раз и на века? Может это зерно ключа? Ну или еще каке-то завороты в голове автора?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.09.2012, 16:43 8
Invader_Zim, Шаблоны.
Или constexpr функция в С++11.
В любом случае не через #define.
1
Twilight Parasite
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
04.09.2012, 16:49 9
ForEveR, а почему нет? Если в макрос скинуть константу, то будет нужный ТС результат
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.09.2012, 16:51 10
Invader_Zim, Потому что макросы не стоит использовать в С++ повсеместно. Да вообще практически не стоит. Потому что это С++. Язык высокого уровня. А #define - наследие от Си, препроцессор просто заменяет вхождение токенов, не зная ничего об областях видимости, типах и прочем. Везде, где можно обойтись без макросов - стоит обходится без них.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
04.09.2012, 16:53 11
Цитата Сообщение от remix.remix Посмотреть сообщение
чтобы перед компиляцией программы выполнолась функция
это вообще как?
remix.remix, https://www.cyberforum.ru/cpp-... 23714.html
0
Twilight Parasite
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
04.09.2012, 16:56 12
ForEveR, Согласен, это не типобезопасно, но это дело привычки. Кому что удобно. Мне например нравится ISO-C++ который 96 года. Больше не требуется. Там и так слишком много фич. ИМХО.
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
04.09.2012, 17:14 13
Прочитал про constexpr. Слава яйцам, теперь можно высчитывать compile-time вещи привычной императивщиной, а не эзотеричной шаблонной магией, оставив наконец шаблоны для обобщённого программирования.

Не по теме:

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

0
Twilight Parasite
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
04.09.2012, 17:53 14
~OhMyGodSoLong~,

Не по теме:

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

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

Не по теме:

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

Не по теме:

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

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

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

0
Twilight Parasite
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
04.09.2012, 18:42 17
~OhMyGodSoLong~,

Не по теме:

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

0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.09.2012, 18:45 18
Invader_Zim, Во-первых до 98 С++ не был стандартизирован. Во вторых практически все люди, пишущие что-то серьезное на С++ используют boost или другую библиотеку, которая не является стандартной.
Согласен, это не типобезопасно, но это дело привычки. Кому что удобно.
О нет, это не дело привычки, это дело того, что человек не знает возможностей С++ и пытается писать что-то, что можно написать на высоком уровне, дедовскими методами (читай Си). Вообще смешивать Си и С++ код считается крайне плохой практикой. Так что тут не в привычке дело, а в желании побыдлокодить.
0
556 / 510 / 25
Регистрация: 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
}
0
Twilight Parasite
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
04.09.2012, 18:51 20
ForEveR, У каждого свои взгляды на вопрос. И от буста я не открещиваюсь, сам его использую. Я знаю что чуть менее чем полностью буст состоит из шаблонов. но моего отношения к излиней абстракции это не меняет.

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

И я не буду отказываться от дефайнов! Ибо чуть менее чем весть кроссплатформенный код состоит из дефайн-салата
0
04.09.2012, 18:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.09.2012, 18:51
Помогаю со студенческими работами здесь

Как Настроить "место Вызова" Всем Пользователям
Есть необходимость большой группе пользователей (св.200) заменить Microsoft Internet Explorer на...

Зачем нужно преобразование при присваивании указателю результата вызова malloc?
Здравия всем! Когда я читал уроки по выделению памяти, там, в большинстве случаев, был примерно...

Glsl - объявленная функция вызывается или код подставляется компоновщиком на место вызова?
В общем то вопрос в шапке. Волнует то, происходит реальный вызов функции в коде или же...

Запись вывода результата выполнения команды в определённое место в файле
Добрый день! Помогите с решением проблемы: Есть файл с настройками программы file1.txt. Строго в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru