remix.remix
|
||||||
1 | ||||||
Встраивание результата функции в место ее вызова04.09.2012, 01:01. Показов 2057. Ответов 24
Метки нет (Все метки)
Здравствуйте. Можно ли как-то реализовать чтобы перед компиляцией программы выполнолась функция, а ее результат встраивался в место ее вызова? Знаю что для фунций есть классификатор inline, но тогда в место вызова встраивается сама функция, а мне нужен именно результат. Например:
|
04.09.2012, 01:01 | |
Ответы с готовыми решениями:
24
Место вызова Вывод на экран результата вызова ls Возврат в место вызова подпрограммы Переключить место вызова программно |
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
||||||
04.09.2012, 01:16 | 2 | |||||
Сразу напомнию: надеюсь, вы понимаете, что если в функцию передаётся не константа, то это невыполнимо в принципе.
Надёжный способ для Си++ есть только один: шаблонная магия. Это позволит рассчитать нужное значение при компиляции и подставить его в нужное место. Но выглядит она не особо ахти даже для такого простого случая: Func<n> = 0 для чётных и 1 для нечётных чисел.
Чем сложнее функция, тем больше придётся писать этой магии. Но чисто принципиально можно так вычислить любую функцию. Вот только запись будет сложной. Ненадёжный способ: компиляторы обычно выполняют свёртку констант и если им удаётся что-то вычислить сразу же, они это сделают и подставят. То же самое с константами: const int n = 10;Все обращения к n чаще всего будут заменены сразу же на её значение. Но заставить компилятор делать это нельзя. Можно только подсказать и попросить, но решать, выполнять или нет подстановку, он будет сам. Вон тот ваш вызов можно вычислить при компиляции, но не факт, что компилятор это увидит и сделает. В Си++ нет нормальной макросистемы, чтобы удобно делать вот такие гарантированные раскрытия кода при компиляции. Есть только шаблоны.
1
|
Twilight Parasite
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
|
|
04.09.2012, 16:04 | 3 |
~OhMyGodSoLong~, Постойте! а как-же макросы? #define и поехали! в принципе то-же самое, если константа, то будет вычислено, иначе нет.
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
|
04.09.2012, 16:53 | 11 |
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~,
Не по теме: А как-же няшка буст? Мыж его все любим!
0
|
137 / 126 / 14
Регистрация: 03.07.2012
Сообщений: 355
|
|
04.09.2012, 18:19 | 15 |
Ну возьмите и напишите вместо этой функции n = 1; Что вам мешает?
Или какое другое значение. Сами рассчитайте во время написания программы и вставьте.
0
|
OhMyGodSoLong
|
04.09.2012, 18:31
#16
|
Не по теме: 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
|
04.09.2012, 18:48 | 19 | |||||
0
|
Twilight Parasite
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
|
||||||
04.09.2012, 18:51 | 20 | |||||
ForEveR, У каждого свои взгляды на вопрос. И от буста я не открещиваюсь, сам его использую. Я знаю что чуть менее чем полностью буст состоит из шаблонов. но моего отношения к излиней абстракции это не меняет.
Добавлено через 1 минуту novi4ok, не, не так
И я не буду отказываться от дефайнов! Ибо чуть менее чем весть кроссплатформенный код состоит из дефайн-салата
0
|
04.09.2012, 18:51 | |
04.09.2012, 18:51 | |
Помогаю со студенческими работами здесь
20
Как Настроить "место Вызова" Всем Пользователям Зачем нужно преобразование при присваивании указателю результата вызова malloc? Glsl - объявленная функция вызывается или код подставляется компоновщиком на место вызова? Запись вывода результата выполнения команды в определённое место в файле Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |