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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
remix.remix
Сообщений: n/a
#1

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

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

Здравствуйте. Можно ли как-то реализовать чтобы перед компиляцией программы выполнолась функция, а ее результат встраивался в место ее вызова? Знаю что для фунций есть классификатор 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++):

оформить решение в виде функции следующими способами: 1. функция расположена после ее вызова; 2. функция расположена после до ее вызова; 3. функ - C++
оформить решение в виде функции следующими способами: 1. функция расположена после ее вызова; 2. функция расположена после до ее...

Вызова функции - C++
Как сделать, что бы MAIN предназначался только для вызова функции(+нельзя использовать глобальные перемменные) Код:Список фамилий...

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

Возвращение результата функции bool и использование его в функции main() - C++
У меня есть функция bool, которая имеет вид: bool Pisos(int row, int place) { if (...) return true; else return false;...

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

Функции. Синтаксис объявления и вызова - C++
1. Написать функцию, которая вычисляет Вариант Задание 1 площадь круга S по его радиусу R (S=R2) 2 площадь треугольника S по...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 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 чаще всего будут заменены сразу же на её значение.

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


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

Не по теме:

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

0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
04.09.2012, 16:39 #6
Invader_Zim, #define в С++ используется редко и не по делу использовать не нужно. Здесь свободно можно обойтись константой, без каких-либо структур, функций, макросов.
0
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 908
04.09.2012, 16:41 #7
ForEveR, а если эту константу надо высчитать? один раз и на века? Может это зерно ключа? Ну или еще каке-то завороты в голове автора?
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
04.09.2012, 16:43 #8
Invader_Zim, Шаблоны.
Или constexpr функция в С++11.
В любом случае не через #define.
1
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 908
04.09.2012, 16:49 #9
ForEveR, а почему нет? Если в макрос скинуть константу, то будет нужный ТС результат
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
04.09.2012, 16:51 #10
Invader_Zim, Потому что макросы не стоит использовать в С++ повсеместно. Да вообще практически не стоит. Потому что это С++. Язык высокого уровня. А #define - наследие от Си, препроцессор просто заменяет вхождение токенов, не зная ничего об областях видимости, типах и прочем. Везде, где можно обойтись без макросов - стоит обходится без них.
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 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 / 2
Регистрация: 21.07.2011
Сообщений: 908
04.09.2012, 16:56 #12
ForEveR, Согласен, это не типобезопасно, но это дело привычки. Кому что удобно. Мне например нравится ISO-C++ который 96 года. Больше не требуется. Там и так слишком много фич. ИМХО.
0
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.09.2012, 17:14 #13
Прочитал про constexpr. Слава яйцам, теперь можно высчитывать compile-time вещи привычной императивщиной, а не эзотеричной шаблонной магией, оставив наконец шаблоны для обобщённого программирования.

Не по теме:

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

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

Не по теме:

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

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

Ошибка вызова шаблонной функции - C++
Вообщем у меня вопрос такой: Использую MVS 2010. Пишу шаблон функции для поиска максимального из двух чисел: template &lt;class T&gt; T...

Макрос вызова функции без скобок - C++
Вообщем хочется получить что-то вроде этого: #include &lt;iostream&gt; using namespace std; #define For ....... int main() { ...

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

Стрелка в описании функции обратного вызова - C++
#include &lt;iostream&gt; #include &lt;algorithm&gt; std::string s = &quot;hello&quot;; auto end = std::unique(s.begin(), s.end(), (char a, char b) -&gt; bool...


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

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

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