Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
135 / 20 / 2
Регистрация: 06.05.2019
Сообщений: 1,359
Записей в блоге: 3
1

Как пропустить часть кода при компиляции?

12.08.2019, 13:40. Показов 2061. Ответов 15
Метки нет (Все метки)

Я хочу объявить макрос #define и вызвать этот макрос далее в коде? Есть нужда в том чтобы пропустить компиляцию этого макроса. Приведите пожалуйста пример как это выглядит.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.08.2019, 13:40
Ответы с готовыми решениями:

Как обмануть компилятор и пропустить часть кода?
Есть некая команда, выполняемая в VB6. А вот VB5 ее не знает и дает ошибку при компиляции...Как...

Как пропустить часть кода, в которой может возникнуть ошибка?
Здравствуйте! При запуске программы всё работает нормально - никаких ошибок нету. Однако в...

Как пропустить некоторое количество html кода в битах при передаче данных из интернета?
Как пропустить некоторое количество html кода в байтах при передаче данных из интернета?То есть...

Как изменить часть кода при разных условиях?
Надо вставить на страницу часть html-кода если введён год меньше или равен 325 если введён год от...

15
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
12.08.2019, 13:48 2
Nexi99, не совсем понял о чем речь, но может вам стоит посмотреть в сторону "условной компиляции".
Пример:
C++
1
2
3
4
5
6
7
8
9
#ifdef identifier
   // код, находящийся здесь, компилируется, если identifier уже был определен для препроцессора в команде #define.
#endif
 
#ifndef identifier
   // код, находящийся здесь, компилируется, если identifier в данный момент не определен командой препроцессора #define.
#endif
 
и т.д.
0
135 / 20 / 2
Регистрация: 06.05.2019
Сообщений: 1,359
Записей в блоге: 3
12.08.2019, 18:13  [ТС] 3
И какую комбинацию нужно выбирать. Покажите как это работает. Я так понимаю нужно поместить туда макрос или функцю а при обращении нужно опять это обернуть этими строками покажите как это происходит.
0
Эксперт С++
8426 / 4099 / 894
Регистрация: 15.11.2014
Сообщений: 9,209
12.08.2019, 18:34 4
Цитата Сообщение от Nexi99 Посмотреть сообщение
Я хочу объявить макрос #define и вызвать этот макрос далее в коде?
это ты у нас спрашиваешь?

Цитата Сообщение от 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
#include <iostream>
 
// --- расскоментируйте, что бы включить отладочный вывод
#define DEBUG_LOGGING
 
#ifdef DEBUG_LOGGING
    #define debug_log(...) std::cout << "debug: " << __VA_ARGS__ << '\n';
#else
    // --- если отладочный вывод выключен,
    // --- тогда макро-функция свернется в пустоту
    #define debug_log(...)
#endif
 
 
 
int main()
{
    std::cout << "hello!\n";
    
    int v = 333;
    (void) v;
    
    debug_log("data = " << v);
    
    std::cout << "finished!\n";
    
}
0
135 / 20 / 2
Регистрация: 06.05.2019
Сообщений: 1,359
Записей в блоге: 3
12.08.2019, 19:52  [ТС] 5
Уже понятно больше
C++
1
#define debug_log(...)
это и есть макрофункция с которой мы работаем?
0
567 / 406 / 132
Регистрация: 22.11.2017
Сообщений: 1,053
12.08.2019, 19:57 6
Nexi99, какую задачу ты решаешь, для чего используешь макросы?
0
135 / 20 / 2
Регистрация: 06.05.2019
Сообщений: 1,359
Записей в блоге: 3
13.08.2019, 16:14  [ТС] 7
Цитата Сообщение от SomniPhobia Посмотреть сообщение
Nexi99, какую задачу ты решаешь, для чего используешь макросы?
Я хотел в похожем языке клоне mql4 через макрос обратиться к массиву таким образом
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#define Mkarr(q,w,e,r) switch(ArrayDimension(q)){case 3:q[w][e][r]=15;break;case 2:q[w][e]=15;break;}
int Mas[7],//#else
    Mas2[2][2]={{3,8},{4,17}},
    Mas22[2][2]={{31,128},{94,107}},
    Mas3[2][2][2];
 
int OnInit()
  {int Perem=ArrayDimension(Mas); 
   Mkarr(Mas2,0,0,0);
   return(INIT_SUCCEEDED);
  }
Где функция ArrayDimension() вернёт ранг массива и через оператор switch выполнить команду, потому что передавать массив к в с++ в mql4 нельзя закрыт доступ к размеренностям массива. Я думал может пропустить код при компиляции а расчёты то верные, вопрос в том можно так сделать или нет. Если честно я так выматался с этими массивами что ужас.
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
13.08.2019, 17:04 8
Nexi99, в С++ уже есть готовое решение для этого, ну и само собой ваше решение на макросах не верное - это мягко говоря. Смотрите в сторону std::rank.
Example:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <type_traits>
 
int main()
{
    std::cout << std::rank<int>{} << "\n\n";
 
    std::cout << std::rank<int[5]>{} << '\n';
    std::cout << std::rank<int[5][5]>{} << '\n';
    std::cout << std::rank<int[][5][5]>{} << '\n';
}
0
135 / 20 / 2
Регистрация: 06.05.2019
Сообщений: 1,359
Записей в блоге: 3
13.08.2019, 18:26  [ТС] 9
Цитата Сообщение от Azazel-San Посмотреть сообщение
#include <iostream>
#include <type_traits>
int main()
{
* * std::cout << std::rank<int>{} << "\n\n";
std::cout << std::rank<int[5]>{} << '\n';
* * std::cout << std::rank<int[5][5]>{} << '\n';
* * std::cout << std::rank<int[][5][5]>{} << '\n';
}
Во первых в с++ да о таких записях я знаю но, речь идёт о чём то универсальном, и я беру макрос т.к. он может принимать любой элемент. Во вторых данная запись <int[5][5]> уже не прокатит потому что я использую шаблонные функции и там будет не int а будут все типы да и к тому же данные записи не работаю в mql4 т.к. там закрыт доступ к памяти и обращаться по адресам в эту память запрещено и проворачивать такие трюки с память и ссылками и указателями нет возможности поэтому только макрос.
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
13.08.2019, 18:34 10
Цитата Сообщение от Nexi99 Посмотреть сообщение
Во вторых данная запись <int[5][5]> уже не прокатит потому что я использую шаблонные функции и там будет не int а будут все типы да
И в чем будет разница? По вашему с интами это будет массив, а с пользовательскими типами это уже не массив?
Тем более std::rank - шаблонная..
Цитата Сообщение от Nexi99 Посмотреть сообщение
и я беру макрос т.к. он может принимать любой элемент
Макрос — это просто копи-паста, макрос != шаблон, он не имеет ничего общего к генерации кода (в общем случае), он просто вместо "вызова" макроса копипастит его тело. Плюс ваш макрос делает непонятно что.
Цитата Сообщение от Nexi99 Посмотреть сообщение
и к тому же данные записи не работаю в mql4
Вроде я еще не окончательно ослеп и мы все еще в разделе по С++ для новичков.
Цитата Сообщение от Nexi99 Посмотреть сообщение
там закрыт доступ к памяти и обращаться по адресам в эту память запрещено и проворачивать такие трюки с память и ссылками и указателями нет возможности поэтому только макрос
Прохладная история.

Так в итоге, вам то, что надо? Код на С++ или на этом вашем mql4? Если первое, то вы его получили, если другое — ошиблись разделом, если еще что-то то, выдохните и нормально объясните что вам надо, какая задача, проблема, код и т.д.
0
135 / 20 / 2
Регистрация: 06.05.2019
Сообщений: 1,359
Записей в блоге: 3
13.08.2019, 21:33  [ТС] 11
Цитата Сообщение от Azazel-San Посмотреть сообщение
и нормально объясните что вам надо, какая задача
Речь шла о том как пропустить код при компиляции мне надо пропустить этот код
C++
1
#define Mkarr(q,w,e,r) switch(ArrayDimension(q)){case 3:q[w][e][r]=15;break;case 2:q[w][e]=15;break;}
, вопрос как это сделать и как обратиться потом к модулю Mkarr(q,w,e,r), как его вызвать ведь это дело будет пропущено при компиляции я читал форумы подобное делали но примеров не видел.
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
13.08.2019, 22:02 12
Цитата Сообщение от Nexi99 Посмотреть сообщение
и как обратиться потом к модулю Mkarr(q,w,e,r)
Еще раз, о каком языке мы сейчас говорим С++? Если да, то в С++ нет модулей, пока (20 стандарт не завезли еще).
То, что у вас называется макрос. Обращаться к нему можно напрямую, как это делали вы:
C++
1
Mkarr(arg1, arg2, arg3, arg4);
Где agr# какой-то параметр.
Цитата Сообщение от Nexi99 Посмотреть сообщение
Речь шла о том как пропустить код при компиляции мне надо пропустить этот код
Что значит пропустить? Еще раз макросы — это препроцессор, это не функция.
0
135 / 20 / 2
Регистрация: 06.05.2019
Сообщений: 1,359
Записей в блоге: 3
13.08.2019, 22:33  [ТС] 13
Цитата Сообщение от Azazel-San Посмотреть сообщение
Еще раз макросы — это препроцессор, это не функция.
Скажите а экспорт макросов из c++ в качестве dll библиотеки возможен или нет?
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
13.08.2019, 22:44 14
Цитата Сообщение от Nexi99 Посмотреть сообщение
Скажите а экспорт макросов из c++ в качестве dll библиотеки возможен или нет?
Хм.. Вы кажется все никак не поймете что такое макрос. Макрос это просто текст, код, который подставляется вместо "вызова" компилятором во время одного из этапов трансляции.
Например такой код:
C++
1
2
3
4
#define ADD(x, y) (x) + (y)
int main() {
    std::cout << ADD(5, 3);
}
превратится в такой, после начала трансляции, а именно во время 4 фазы, когда отрабатывает препроцессор:
C++
1
2
3
int main() {
    std::cout << 5 + 3;
}
После этой фазы все директивы препроцессора удаляются из исходного кода.
Соответственно, надеюсь вы понимаете, что макрос не может быть интерфейсом или как-либо быть экспортированным.
0
183 / 158 / 27
Регистрация: 13.08.2019
Сообщений: 605
14.08.2019, 05:04 15
Цитата Сообщение от Nexi99 Посмотреть сообщение
Речь шла о том как пропустить код при компиляции мне надо пропустить этот код
Комментируйте ненужные участки кода и тогда они будут вне поля видимости компилятора.
С уважением,
Ваш КЭП.
0
135 / 20 / 2
Регистрация: 06.05.2019
Сообщений: 1,359
Записей в блоге: 3
16.08.2019, 21:28  [ТС] 16
Цитата Сообщение от Хуба-Буба Посмотреть сообщение
Комментируйте ненужные участки кода
Кстати о комментариях, как в с++ закомментировать и раскомментировать код нажатием горячих клавиш или как их настроить а также сделать подсвечивание скобок, вот я тему создавал но ответов по настройкам довольно мало Можно ли для C++ сделать подсвечивание скобок? Как комментировать код в C++?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.08.2019, 21:28

Есть ли возможность скрыть часть кода одним символом при написании кода?
Мне интересно есть ли возможность скрыть часть кода программы от его копирования(от конкурентов...

Пропустить\не пропустить при слиянии
Здравствуйте! Такое дело: выполняю слияние двух документов. Все вроде бы хорошо, да вот только...

Как вытащить часть кода из кода страницы?
Знаю, что можно через json как-то. Вот например есть код страницы, на нем есть несколько одинаковых...

Выбор кода при компиляции
Здравствуйте! Столкнулся с почти аналогичной проблемой, как и описанная в данной статье: ...


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

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

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