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

препроцессор с++ - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Виртуальный файловый сервер/клиент http://www.cyberforum.ru/cpp-beginners/thread347575.html
необходимо написать программу файловый сервер, подскажите плиз документацию на эту тему. и желательно на русском языке.
C++ Рекурсия на картинке файлик из википедии в которой говорится что рекусия имеет вид дерева и некоторые ветви могут вычислятся по многу раз. А как это реализованно в с++? то же с повторениями? И как выделяется память под рекусивный вызов? Например есть функция с набором локальных переменных - они будут жить до тех пор пока не завершится функция, т.е. так долго пока не будет выход из рекурсии? и мы будем... http://www.cyberforum.ru/cpp-beginners/thread347566.html
C++ Не выделение памяти
По какой причине не работает это программа ? #include<iostream> #include <string> using namespace std; int main () {setlocale(LC_ALL,"Rus"); int z; cout<<"Введите кол-во чисел --> "; cin>>z;
Незнаю как вставить файл из буфера обмена...надеюсь на помощь C++
//---------- Сама программа ----------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include <vcl\Clipbrd.hpp> #include "Unit1.h" #include "CopyFilesToClipboard.cpp" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm"
C++ Написание интерпретируемого языка программирования http://www.cyberforum.ru/cpp-beginners/thread347523.html
Короче, я хочу овладеть языком Си и написать на нем свой интерпретируемый язык программирования %-) Но к сожалению, сейчас моих знаний не хватает даже на написание токенайзера, что меня не радует. Посоветуйте, какие задачи решать, какие алгоритмы реализовывать, что бы в конце-концов прийти к своей цели. П.С. Заранее хочу сказать, что готовые решения типа Флексов, Бизонов и т.д. предлогать не...
C++ Красно-чёрное дерево Здравствуйте! мне нужно создать красное-чёрное дерево...посоветуйте простой понятный учебник или код с объяснениями...заранее спасибо подробнее

Показать сообщение отдельно
Bers
Заблокирован
02.09.2011, 19:59     препроцессор с++
Задача:

Сделать так, что бы при определённом условии класс "знал" что его тестируют в консоли, и выводил в неё всю необходимую служебную информацию.
В режиме же реальной работы, даже сам код вывода данных в консоль не должен быть скомпилированным.

Возникшая сложность:

В случаи, если режим работы - тестирование классов, то требуется выполнить некоторую предварительную подготовку приложения к работе. Другими словами - запустить на выполнение некий набор функций.

Вопрос: Можно ли так сделать, что бы в случае, если идентификатор (#define) определён - при компиляции будут запущены и выполнены некоторые дополнительные функции?

Один из вариантов ответа:

Ниже представлен полностью рабочий код. В нём мне удалось реализовать задачу, озвученную выше. Однако, удалось это сделать только при помощи глобального объекта.

Меня же интересует, можно ли это сделать как нибудь так, что бы обойтись без глобальных объектов? А так же, к каким проблемам может привести ниже представленный код.

Критика кода приветствуется.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//BazisConsole.cpp   Точка входа в программу.
 
#define TEST_CONSOLE_ON  //режим работы:  Проведение тестов. выводить данные через консоль.
#define TEST_FUNCTION_ON //режим работы:  Проверка на ошибки. Запускать тестовые функции.
 
#include "Macross/TestConsole.h" //загрузка макроса
 
//Препроцессор сам позаботится обо всех предварительных 
//подготовках макросов, и самого приложения к работе
 
//для иллюстрации
void Foo(){   std::cout << "Тест3: Запуск макроса TEST"<<std::endl;   }
 
int main (void)
{
    //проверка работоспособности макросов
    CTEXT("Тест1: Добро пожаловать на тесты");
    CTEXT2("Тест2: Текст и число:", 10);
    TEST( Foo() );
    COUT( cout << "Тест4: COUT"<< endl );   
}

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
//TestConsole.h 
 
#ifndef TestConsole_h
#define TestConsole_h
 
//02.09.2011. Модифицировал Берс.
 
//Макросы, которые выводят сообщения в консоли, 
//только если определён специальный идентификатор.
//Так же, есть специальный макрос запускающий функцию, 
//только если определён специальный идентификатор. 
 
//ПРИМИЧАНИЕ: предназначен только для работы в студии, в ОС Windows
//ПРИМИЧАНИЕ: макрос TEST(  функция()  ); может привести к трагедии,
//если внутри функции, 
//так же будит запущен макрос TEST, 
//внутри которого....  в общем, избегайте рекурсии вызовов макроса.
 
//#define TEST_CONSOLE_ON   //если этот идентификатор определён, 
                            //то препроцессор настроит консоль, 
                            //и подготовит макросы к работе
 
//#define TEST_FUNCTION_ON   //если идентификатор не определён, 
                                           //то макрос TEST свернётся в пустоту.
 
#ifdef TEST_FUNCTION_ON
    //Если TEST_FUNCTION_ON определен, то...
    #define TEST(Function) Function 
#else    
    //Если TEST_FUNCTION_ON не определен, то...
    #define TEST(Function) ;;
#endif
 
#ifdef TEST_CONSOLE_ON
     //Если TEST_CONSOLE_ON определен, то...
     #include <iostream>     //организация потоков cin cout
     #include "windows.h"    //конкретно сейчас нужен для того, 
                             //что бы компилятор знал о существовании 
                             //SetConsoleOutputCP(), SetConsoleCP();
     class CRun
     {
     public:
         CRun() { SetConsole(); }
         void SetConsole()
         {
             //Запуск функций, которые нужно выполнить
             // перед тем, как начнётся тело main()
             
             //настройка кодировки консоли
             SetConsoleOutputCP(1251);    SetConsoleCP(1251);      
             
             //увеличивает точность показа дробной части в консоли
             std::cout.setf(std::ios::fixed,std::ios::floatfield); 
         }
     } GlobalRun;
 
     #define COUT(Text)  {using std::cout; using std::endl; Text;} 
     #define CTEXT(Text) std::cout<< Text<<std::endl
     #define CTEXT2(Text1, Text2) std::cout<< Text1<<" "<<Text2<<std::endl
 #else    
     //Если TEST_CONSOLE_ON не определен, то...
     #define COUT(Text) ;;
     #define CTEXT(Text) ;;
     #define CTEXT2(Text1, Text2) ;;
 #endif
 
//Пример использования:
 
// #define TEST_CONSOLE_ON  //если определён, 
// то макросы CTEXT, CTEXT2, COUT 
//свернуться в пустоту
//
/
// #define TEST_FUNCTION_ON //если не определён, 
// то макрос TEST свернётся в пустоту
//
//
// #include "TestConsole.h" //реализация макроса
//
// int main (void)
// {
//         CTEXT("Тест1: Добро пожаловать на тесты");
//         CTEXT2("Тест2: Текст и число:", 10);
//         TEST( std::cout<<"Тест3: Запускаю макрос TEST"<<std::endl );
//         COUT( cout << "Тест4: COUT"<< endl ); 
//     return 0;
// }
 
//Если TEST_CONSOLE_ON не был определён, то макрос свернётся в пустоту, 
//и код вывода сообщений в консоль вообще не будит скомпилирован
 
#endif
Обратите внимание на объект CRun GlobalRun

Он объявляется, и определяется в глобальном пространстве.
Код, выполняемый в его конструкторе - это и есть тот кусок кода, которые запустится в случае, если дефайн будит определён.

1. К каким проблемам могут привести макросы?
2. К каким проблемам может привести создание глобального объекта?
3. Есть ли другие способы добиться аналогичного эффекта, но при этом, вообще не создавая глобальных объектов?
4. Как сделать макросы кросс-платформенными? В частности, нужно избавиться от windows.h в случае, если компилируемый код - не под ос виндовс. Но тогда объект GlobalRun ругнется на незнание функций консоли...

Добавлено через 11 минут
/зы в строке 75 - опечатка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 12:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru