Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/34: Рейтинг темы: голосов - 34, средняя оценка - 4.82
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4

Как выполнить код на этапе компиляции?

07.09.2020, 20:24. Показов 8265. Ответов 56
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Предположим есть функция(может быть какая угодно часть кода).
C++
1
2
3
void Funkz(){
/*...*/
}
Далее мне нужно вызвать её на этапе компиляции и в дальнейшем её не трогать. Можете показать примеры и не с этой функцией а с чем-то другим. Извините что вопрос такой абстрактный.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.09.2020, 20:24
Ответы с готовыми решениями:

Как добавить анонимный тип в объект не на этапе компиляции, а на этапе выполнения программы? Надо для routes.MapRoute
В приложении ASP.NET MVC у меня есть xml файл с маршрутами типа: <route url="Home/{par1}/{par2}" controller="Home"...

Возможно ли изменить байт-код класса потомка на этапе компиляции?
Стало интересно, возможно ли, например, написать аннотацию и процессор к ней, которая будет применятся к родительскому классу и любым(хоть...

Как на этапе компиляции определить принадлежность к классу?
Есть шаблонный класс, который в зависимости от переданного класса в параметре подбирает нужный контейнер-обёртку. ...

56
76 / 68 / 10
Регистрация: 11.07.2016
Сообщений: 320
08.09.2020, 20:02
Студворк — интернет-сервис помощи студентам
hoggy, да, забыл вызвать (студия на одном пк работает, пишу с другого). С остальным согласен, ошибался.

Avazart, DRY? Я уж было испугался, пару минут гуглил даже, что это за принцип DRI такой, который я умудрился нарушить)

В общем, да, ничего вменяемого кроме всевозможных проверок, видимо, не сделать. На гитхабе такое встречается.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.09.2020, 21:14
Да опечатка. Почему сразу не создать массив масcивов, который объявить глобально, а не возвращая из ф-ции ?

Добавлено через 16 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
enum { r, g, b };
enum { REC601, REC709 };
 
const double K[2][3] =
{
  {0.299,  0.587,  0.114},
  {0.2126, 0.7152, 0.0722}
};
 
constexprt double f(double r, double b)
{ 
  return -0.5*r/(1.-b);
}
 
const double coeff[2][8] =
{
  {K[REC601][r],  K[REC601][g],  K[REC601][b], f(K[REC601][r],K[REC601][b])  ...
  {K[REC709][r],  K[REC709][g],  ...
};
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
09.09.2020, 20:38  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
А что ты собрался делать в этой функции, которая возвращает viod, на этапе компиляции, какие результаты ты от неё ждёшь?
У меня есть задача я хочу в переменную string (или напечатать в файл) сохранить код программы как текст и на этапе компиляции хочу чтобы были найдены нужные элементы, которые в дальнейшем будут использоваться для расчётов а данный текст будет автоматически уничтожен. Получается что я знаю всё заранее и могу вычислить такую процедуру на этапе компиляции. Ту функцию я взял как пример я думал есть обобщённая специфика управления этой процедурой но видимо тут всё тяжко. Другими словами сделать эффект интерпретатора на стадии компиляции ну а дальше использовать простые расчёты.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.09.2020, 20:42
Цитата Сообщение от Nexi99 Посмотреть сообщение
сохранить код программы как текст
Куда сохранить?

Добавлено через 1 минуту
Цитата Сообщение от Nexi99 Посмотреть сообщение
Другими словами сделать эффект интерпретатора на стадии компиляции ну а дальше использовать простые расчёты.
Звучит изначально невероятно глупо.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
09.09.2020, 20:44
Цитата Сообщение от Nexi99 Посмотреть сообщение
У меня есть задача я хочу в переменную string (или напечатать в файл) сохранить код программы как текст и на этапе компиляции хочу чтобы были найдены нужные элементы, которые в дальнейшем будут использоваться для расчётов а данный текст будет автоматически уничтожен.
В compile-time рассчитывается результат, который вернёт функция.
void там делать бессмысленно, ничего внутри такой функции ты не сделаешь, кроме static_assert.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.09.2020, 20:44
Или я может не правильно понял и имеется виду кодогенерация?
(как для парсеров это делается и MOC в Qt)
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
09.09.2020, 21:32  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Куда сохранить?
C++
1
2
string k="Pomidor"
bool e=0;
На этапе компиляции проверяем наличия слова Pomidor если оно есть то е=1; Ну а дальше работать с е понятное дело что вы не понимаете зачем это нужно ведь это можно выполнить и так но я же не могу вам писать здесь длинные фразы что они будут делать. Просто у меня есть идея как это использовать и объяснять всю идею будет долго.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
09.09.2020, 21:46
C++
1
string
Nexi99, стринги это синтетика. На этапе компиляции нужно что-то натуральное. Дубовое, подойдёт. Это я для краткости, если вам лаконизм по душе. Зачем долго объяснять, действительно.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.09.2020, 21:46
Допустим у Вас есть файл А.cpp в проекте где это определена строка k
Вы пишите консольную утилиту которая будет парсить A.cpp искать cтроку k и генерировать на её основе файл B.сpp в который будет записывать bool e с соответствующим значением.

Остается только настроить IDE/компилятор что бы перед компиляций запускалась Ваша утилита для кодогенерации а затем уже шла сама компиляция/сборка.

Для того что утилите было проще искать можно искомые места обозначать пустыми(или не пустыми) макросами.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
09.09.2020, 23:07  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Допустим у Вас есть файл А.cpp в проекте где это определена строка k
Вы пишите консольную утилиту которая будет парсить A.cpp искать cтроку k
Ну да такое бы мне тоже подошло. А как работает typeid он же умеет просматривать собственный код?
Цитата Сообщение от IGPIGP Посмотреть сообщение
стринги это синтетика. На этапе компиляции нужно что-то натуральное. Дубовое, подойдёт. Это я для краткости, если вам лаконизм по душе. Зачем долго объяснять, действительно.
это массив char можно просмотреть его и сравнить все символы если совпадут изменить значение е на истину, разве это нельзя сделать на этапе компиляции.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
09.09.2020, 23:13
Цитата Сообщение от Nexi99 Посмотреть сообщение
это массив char можно просмотреть его и сравнить все символы если совпадут изменить значение е на истину, разве это нельзя сделать на этапе компиляции.
У массивов нет оператора сравнения, а библиотека cstring ещё далеко. Nexi99, а почему не задефайнить имечко какое-то? И проверять препроцессорными #ifndef------#endif.
Не обращайте внимания. Это я вангую. Нервишки дают фальстарт. Пока не скажете, что хотите сделать (не раскрывая глубинной сути, конечно) не смогу сказать, что-то не смешное.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.09.2020, 23:23
Цитата Сообщение от Nexi99 Посмотреть сообщение
А как работает typeid
"Работает" внутри компилятора ...

Добавлено через 3 минуты
Цитата Сообщение от Nexi99 Посмотреть сообщение
это массив char можно просмотреть его и сравнить все символы если совпадут изменить значение е на истину, разве это нельзя сделать на этапе компиляции.
Нельзя. Шаблоны "не умеют работать" со строками.

Для таких целей обычно используют enum class

Добавлено через 3 минуты
C++
1
enum class K:bool { Pomidor=false, Tblblako=true };
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
09.09.2020, 23:49  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
У массивов нет оператора сравнения
Вы как читаете, я выше написал сравнить каждый символ а не массив, я знаю что в с++ нельзя так сравнивать тут вручную нужно это делать.
Цитата Сообщение от Avazart Посмотреть сообщение
Нельзя. Шаблоны "не умеют работать" со строками.
Я об этом не знал это очень плохо. Просто typeid нихрена он не находит он видит только первый уровень а мне нужно глубже, получается что мне нужно составить текст программы, сравнить, а потом действовать, я думал можно выполнить эти расчёты на стадии компиляции т.к. текст программы известен.
А какими способами можно прочитать ещё собственную инструкцию, насколько я это всё понял конечная инструкция будет храниться на ассемблере и её расшифровывать будет сложно но тем не менее всё равно инструкция куда-то пишется и мне конечно лучше её читать текстом?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
10.09.2020, 00:02
Цитата Сообщение от Nexi99 Посмотреть сообщение
Вы как читаете, я выше написал сравнить каждый символ а не массив, я знаю что в с++ нельзя так сравнивать тут вручную нужно это делать.
Откуда будете брать исходный проверяемый массив, символы которого будете сравнивать? Допустим это из массива командной строки, - да? И будет неконстантное выражение.
Nexi99, тяжело ванговать всё время. Когда напишете что-то определяющее задачу, может попробую сказать что-то. Да тут и без меня найдется кому подсказать. Я пока - пас.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
10.09.2020, 00:09  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Откуда будете брать исходный проверяемый массив, символы которого будете сравнивать? Допустим это из массива командной строки, - да? И будет неконстантное выражение.
В принципе да получается что его не существует и естественно выполниться это дело на этапе компиляции не может.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
10.09.2020, 00:54
Цитата Сообщение от Nexi99 Посмотреть сообщение
В принципе да получается что его не существует и естественно выполниться это дело на этапе компиляции не может.
О чём и речь

Добавлено через 9 минут
В конце, для улыбнуть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <cassert>
 
#define concharra //закомментируй и посмотри : error: static assertion failed: nonconchar|
 
#ifdef concharra
constexpr char conchar[]="conchar";
#else
constexpr char conchar[]="nonchar";
#endif
 
constexpr
bool is_c()
{
return
conchar[0]=='c'?
conchar[1]=='o'?
conchar[2]=='n'?
conchar[3]=='c'?
conchar[4]=='h'?
conchar[5]=='a'?
conchar[6]=='r'?
true
:
    true
:
    true
:
    true
:
    true
:
    true
:
    true
:
 
    false ;
}
 
static_assert(is_c(), "nonconchar") ;
int main()
{
    std::cout<<is_c();
 
return 0;
}
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
10.09.2020, 04:05  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
О чём и речь
а можно ли прочитать текстовый файл на этапе компиляции?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
10.09.2020, 10:24
Цитата Сообщение от Nexi99 Посмотреть сообщение
а можно ли прочитать текстовый файл на этапе компиляции?
Если крупно напечатан, - можно.
Возможная реализация:
1. Завариваете кофе.
2. Cтавите на столик чашку и турочку.
3. Рядом кладёте фал со свежей газетой.
4. Запускаете make на компе.
5. Наслаждаетесь чтением.


Добавлено через 32 минуты
Nexi99, а если шутя - то ваш файл должен быть известен на этапе компиляции. Это значит, что вы можете зашить его в огромный (или не очень) массив байт. Можно также разместить в ресурсах исполняемого файла, но это будет непереносимо.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
10.09.2020, 10:52
Цитата Сообщение от Nexi99 Посмотреть сообщение
а можно ли прочитать текстовый файл на этапе компиляции?
Подключи его при помощи #include
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
10.09.2020, 11:07
Nexi99, конечно большие данные не стоит проверять даже так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <cassert>
 
#define concharra //закомментируй и посмотри : error: static assertion failed: nonconchar|
 
#ifdef concharra
constexpr char conchar[]="conchar";
#else
constexpr char conchar[]="nonchar";
#endif
 
constexpr
bool is_c()
{
    return
    conchar[0]=='c' &&
    conchar[1]=='o' &&
    conchar[2]=='n' &&
    conchar[3]=='c' &&
    conchar[4]=='h' &&
    conchar[5]=='a' &&
    conchar[6]=='r' ;
}
 
static_assert(is_c(), "nonconchar") ;
 
int main()
{
    std::cout<<is_c();
 
return 0;
}
но тернарная операция может помочь при альтернативной инициализации констант и ссылок на константы. То есть, большие данные не обязательно сравнивать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <cassert>
 
#define concharra //закомментируй и посмотри
 
#ifdef concharra
constexpr int hash_of_file_array=1;//число может быть любое
#else
constexpr int hash_of_file_array=2;
#endif
 
    constexpr char conchar1[]="conchar";//большой массив
    constexpr char conchar2[]="nonchar";//большой массив
 
constexpr
const char * what_c()
{
    return
        hash_of_file_array == 1 ?
            conchar1
            :
                hash_of_file_array == 2 ?
                conchar2
                :
                    0                   ;
 
}
 
constexpr const char *conchar=what_c();
 
int main()
{
    std::cout<<conchar;
 
return 0;
}
Но лучше уже сами conchar'ы зашить в ветви логики прекомпиляции, а само имя concharra использовать как управляющее. Тогда в исходник попадёт только нужный массив. Однако время загрузки и объём кода увеличатся. Вычисления времени компиляции сказываются на рантайме неизбежно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.09.2020, 11:07

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

Ключевое слово constexpr: как определить удалось ли вычислить возвращаемое значение на этапе компиляции?
https://habrahabr.ru/post/228181/ Как определить удалось ли вычислить возвращаемое значение на этапе компиляции? Я понимаю что...

C++14: вычисления на этапе компиляции
Добрый день. Есть такой код:struct Qaz { constexpr Qaz(uint8_t index) : _index(index) {} private: uint8_t _index; ...

Ошибка на этапе компиляции
в чём может быть проблема?

Ошибка на этапе компиляции
Добрый вечер. Ребят помогите, не могу понять в чем дело. Есть программа в которой описан 1 класс (работа с пользователями) Всё...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru