Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
remix.remix
0 / 0 / 0
Регистрация: 31.08.2012
Сообщений: 1
#1

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

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

Здравствуйте. Можно ли как-то реализовать чтобы перед компиляцией программы выполнолась функция, а ее результат встраивался в место ее вызова? Знаю что для фунций есть классификатор inline, но тогда в место вызова встраивается сама функция, а мне нужен именно результат. Например:
http://www.cyberforum.ru/cpp-beginners/thread979173.html

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;".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2012, 01:01
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Встраивание результата функции в место ее вызова (C++):

Вызова функции
Как сделать, что бы MAIN предназначался только для вызова функции(+нельзя...

Возвращение результата функции bool и использование его в функции main()
У меня есть функция bool, которая имеет вид: bool Pisos(int row, int place)...

Абстракция вызова функции
Итак я хотел бы обсудить с участниками форума такую задачу. Но перед тем как...

Ошибка вызова шаблонной функции
Вообщем у меня вопрос такой: Использую MVS 2010. Пишу шаблон функции для...

Ошибка вызова шаблонной функции - C++
Читаю Прата, остановился на таком задании: Напишите функцию с интерфейсом в...

24
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 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
Invader_Zim
Twilight Parasite
153 / 149 / 7
Регистрация: 21.07.2011
Сообщений: 908
04.09.2012, 16:04 #3
~OhMyGodSoLong~, Постойте! а как-же макросы? #define и поехали! в принципе то-же самое, если константа, то будет вычислено, иначе нет.
0
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
04.09.2012, 16:35 #4
а зачем вообще компилятор, программа, ...? уже все посчитано...
0
Invader_Zim
Twilight Parasite
153 / 149 / 7
Регистрация: 21.07.2011
Сообщений: 908
04.09.2012, 16:37 #5
novi4ok,

Не по теме:

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

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

Не по теме:

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

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

Не по теме:

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

0
Intel~lect
135 / 124 / 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
Invader_Zim
Twilight Parasite
153 / 149 / 7
Регистрация: 21.07.2011
Сообщений: 908
04.09.2012, 18:42 #17
~OhMyGodSoLong~,

Не по теме:

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

0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
04.09.2012, 18:45 #18
Invader_Zim, Во-первых до 98 С++ не был стандартизирован. Во вторых практически все люди, пишущие что-то серьезное на С++ используют boost или другую библиотеку, которая не является стандартной.
Согласен, это не типобезопасно, но это дело привычки. Кому что удобно.
О нет, это не дело привычки, это дело того, что человек не знает возможностей С++ и пытается писать что-то, что можно написать на высоком уровне, дедовскими методами (читай Си). Вообще смешивать Си и С++ код считается крайне плохой практикой. Так что тут не в привычке дело, а в желании побыдлокодить.
0
novi4ok
551 / 504 / 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
Invader_Zim
Twilight Parasite
153 / 149 / 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2012, 18:51
Привет! Вот еще темы с решениями:

Функции. Синтаксис объявления и вызова
1. Написать функцию, которая вычисляет Вариант Задание 1 площадь круга S по...

Мое видение вызова функции
main() { char *fun( int&amp;, int); int *x, y=11, z; char *s; x=new int...

Нет подходящей функции для вызова
Добрый вечер ребята! Помогите исправить ошибку. При компиляции выскакивает...

Не понятный глюк вызова перегруженной функции
void f (std::wfstream&amp;, bool, const char*, size_t , size_t); void f ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru