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

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

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

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

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

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

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

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

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

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

В общем, да, ничего вменяемого кроме всевозможных проверок, видимо, не сделать. На гитхабе такое встречается.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.09.2020, 21:14 22
Да опечатка. Почему сразу не создать массив мас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
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
09.09.2020, 20:38  [ТС] 23
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
А что ты собрался делать в этой функции, которая возвращает viod, на этапе компиляции, какие результаты ты от неё ждёшь?
У меня есть задача я хочу в переменную string (или напечатать в файл) сохранить код программы как текст и на этапе компиляции хочу чтобы были найдены нужные элементы, которые в дальнейшем будут использоваться для расчётов а данный текст будет автоматически уничтожен. Получается что я знаю всё заранее и могу вычислить такую процедуру на этапе компиляции. Ту функцию я взял как пример я думал есть обобщённая специфика управления этой процедурой но видимо тут всё тяжко. Другими словами сделать эффект интерпретатора на стадии компиляции ну а дальше использовать простые расчёты.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.09.2020, 20:42 24
Цитата Сообщение от Nexi99 Посмотреть сообщение
сохранить код программы как текст
Куда сохранить?

Добавлено через 1 минуту
Цитата Сообщение от Nexi99 Посмотреть сообщение
Другими словами сделать эффект интерпретатора на стадии компиляции ну а дальше использовать простые расчёты.
Звучит изначально невероятно глупо.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
09.09.2020, 20:44 25
Цитата Сообщение от Nexi99 Посмотреть сообщение
У меня есть задача я хочу в переменную string (или напечатать в файл) сохранить код программы как текст и на этапе компиляции хочу чтобы были найдены нужные элементы, которые в дальнейшем будут использоваться для расчётов а данный текст будет автоматически уничтожен.
В compile-time рассчитывается результат, который вернёт функция.
void там делать бессмысленно, ничего внутри такой функции ты не сделаешь, кроме static_assert.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.09.2020, 20:44 26
Или я может не правильно понял и имеется виду кодогенерация?
(как для парсеров это делается и MOC в Qt)
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
09.09.2020, 21:32  [ТС] 27
Цитата Сообщение от Avazart Посмотреть сообщение
Куда сохранить?
C++
1
2
string k="Pomidor"
bool e=0;
На этапе компиляции проверяем наличия слова Pomidor если оно есть то е=1; Ну а дальше работать с е понятное дело что вы не понимаете зачем это нужно ведь это можно выполнить и так но я же не могу вам писать здесь длинные фразы что они будут делать. Просто у меня есть идея как это использовать и объяснять всю идею будет долго.
0
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
09.09.2020, 21:46 28
C++
1
string
Nexi99, стринги это синтетика. На этапе компиляции нужно что-то натуральное. Дубовое, подойдёт. Это я для краткости, если вам лаконизм по душе. Зачем долго объяснять, действительно.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.09.2020, 21:46 29
Допустим у Вас есть файл А.cpp в проекте где это определена строка k
Вы пишите консольную утилиту которая будет парсить A.cpp искать cтроку k и генерировать на её основе файл B.сpp в который будет записывать bool e с соответствующим значением.

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

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

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

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

Добавлено через 3 минуты
C++
1
enum class K:bool { Pomidor=false, Tblblako=true };
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
09.09.2020, 23:49  [ТС] 33
Цитата Сообщение от IGPIGP Посмотреть сообщение
У массивов нет оператора сравнения
Вы как читаете, я выше написал сравнить каждый символ а не массив, я знаю что в с++ нельзя так сравнивать тут вручную нужно это делать.
Цитата Сообщение от Avazart Посмотреть сообщение
Нельзя. Шаблоны "не умеют работать" со строками.
Я об этом не знал это очень плохо. Просто typeid нихрена он не находит он видит только первый уровень а мне нужно глубже, получается что мне нужно составить текст программы, сравнить, а потом действовать, я думал можно выполнить эти расчёты на стадии компиляции т.к. текст программы известен.
А какими способами можно прочитать ещё собственную инструкцию, насколько я это всё понял конечная инструкция будет храниться на ассемблере и её расшифровывать будет сложно но тем не менее всё равно инструкция куда-то пишется и мне конечно лучше её читать текстом?
0
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
10.09.2020, 00:02 34
Цитата Сообщение от Nexi99 Посмотреть сообщение
Вы как читаете, я выше написал сравнить каждый символ а не массив, я знаю что в с++ нельзя так сравнивать тут вручную нужно это делать.
Откуда будете брать исходный проверяемый массив, символы которого будете сравнивать? Допустим это из массива командной строки, - да? И будет неконстантное выражение.
Nexi99, тяжело ванговать всё время. Когда напишете что-то определяющее задачу, может попробую сказать что-то. Да тут и без меня найдется кому подсказать. Я пока - пас.
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
10.09.2020, 00:09  [ТС] 35
Цитата Сообщение от IGPIGP Посмотреть сообщение
Откуда будете брать исходный проверяемый массив, символы которого будете сравнивать? Допустим это из массива командной строки, - да? И будет неконстантное выражение.
В принципе да получается что его не существует и естественно выполниться это дело на этапе компиляции не может.
0
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
10.09.2020, 00:54 36
Цитата Сообщение от 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
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
10.09.2020, 04:05  [ТС] 37
Цитата Сообщение от IGPIGP Посмотреть сообщение
О чём и речь
а можно ли прочитать текстовый файл на этапе компиляции?
0
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
10.09.2020, 10:24 38
Цитата Сообщение от Nexi99 Посмотреть сообщение
а можно ли прочитать текстовый файл на этапе компиляции?
Если крупно напечатан, - можно.
Возможная реализация:
1. Завариваете кофе.
2. Cтавите на столик чашку и турочку.
3. Рядом кладёте фал со свежей газетой.
4. Запускаете make на компе.
5. Наслаждаетесь чтением.


Добавлено через 32 минуты
Nexi99, а если шутя - то ваш файл должен быть известен на этапе компиляции. Это значит, что вы можете зашить его в огромный (или не очень) массив байт. Можно также разместить в ресурсах исполняемого файла, но это будет непереносимо.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
10.09.2020, 10:52 39
Цитата Сообщение от Nexi99 Посмотреть сообщение
а можно ли прочитать текстовый файл на этапе компиляции?
Подключи его при помощи #include
1
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
10.09.2020, 11:07 40
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
10.09.2020, 11:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.09.2020, 11:07
Помогаю со студенческими работами здесь

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

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

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

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

Чтение файла на этапе компиляции
Можно ли считать файл настроек на этапе компиляции? Нужно что бы выбросить код который в рантайме...

Загрузка изображений на этапе компиляции
Нужно загрузить на этапе компиляции 15 изображений. Делаю это так: var Img1:Class; var...


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

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