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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.86
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
#1

[C++] Директива #define. В виде макроса определен шаблон функции. - C++

14.12.2011, 01:24. Просмотров 2785. Ответов 12
Метки нет (Все метки)

Здравствуйте!

Есть проблема и мне она непонятна!

В программке присутствует директива #define в ней в виде макроса определен шаблон функции.


Но в чем проблема!

Так работает без проблем!
C++
1
#define template_obmen(type) void obmen_##type(type *mas,int n) {  type buf = mas[0];   mas[0] = mas[n-1];  mas[n-1] = buf;  }
Но стоит разбить эту строку, так она отказываеться работать

C++
1
2
3
4
5
6
7
#define template_obmen(type) \
void obmen_##type(type *mas,int n) \
{   
    type buf = mas[0]; \  
    mas[0] = mas[n-1]; \
    mas[n-1] = buf;  \
}
В чем может быть проблема??

спасибо!
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2011, 01:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос [C++] Директива #define. В виде макроса определен шаблон функции. (C++):

Директива #define c директивой #else - C++
Учу Win32 API и столкнулся с таким примером как директиву #define можно использовать с директивой #else? Плюс тут еще куча ошибок непонятно...

Директива #define для нахождения наименьшего из двух чисел. Сумма ряда - C++
помогите решить Даны целые числа а и b. Используя директиву #define для нахождения наименьшего из двух чисел, вычислить значение ...

Define внутри макроса - C++
Подкажите возможно ли написать макрос кот. создаст #define? например: #define MACRO(name) #define NAME name знаю, что напрямую...

Шаблон: Метод text() не определен для объекта класса TreeWidget - C++
Есть код:template<MainMenuGenerator::ElementTypes type, class T> TreeWidgetItem *MainMenuGenerator::_addMenuItem(const String &line, T...

Объявление функции через #define - C++
Доброе время суток, у меня возник такой вопрос. Хотел сократить код для получения кол-ва ячеек в массиве ...

Define внутри макро-функции - C++
Возможно ли сделать в стиле: #define MY_MACRO( a, b ) \ # ifdef a \ # define b 1 \ # ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Bers
Заблокирован
14.12.2011, 01:50 #2
У тя там ошибочка небольшная в макросе:

C++
1
2
3
4
5
6
7
#define template_obmen(type)       \
void obmen_##type(type *mas,int n) \
{                                  \
    type buf = mas[0];             \  
    mas[0] = mas[n-1];             \   
    mas[n-1] = buf;                \   
}
1
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
14.12.2011, 01:55  [ТС] #3
Я как бы такой вариант тоже пробовал, но увы!
0
Миниатюры
[C++] Директива #define. В виде макроса определен шаблон функции.  
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
14.12.2011, 01:58  [ТС] #4
такой вариант работает

C++
1
2
3
4
5
#define template_obmen(type)       \
void obmen_##type(type *mas,int n) \
{                                  \
    type buf = mas[0];             mas[0] = mas[n-1];     mas[n-1] = buf;     \
}
но явно не подходит, с точки зрения форматирования кода!
0
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
14.12.2011, 02:21  [ТС] #5
Блин теперь работает, непонятно!)
0
Миниатюры
[C++] Директива #define. В виде макроса определен шаблон функции.  
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
14.12.2011, 02:26 #6
Infinity3000, на liveworkspace все работает. Почему шаблоны не использовать?
1
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
14.12.2011, 03:23  [ТС] #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Хочется, если можно так выразиться, досконально изучить Препроцессорные средства!

Кстати, опять этот код перестал работать!

C++
1
2
3
4
5
6
7
#define template_obmen(type)        \
void obmen_##type(type *mas,int n)  \
{                   \
    type buf = mas[0];          \    
    mas[0] = mas[n-1];      \
    mas[n-1] = buf;         \
}
работает через раз, по непонятным причинам!!


Кстати таже проблемма и в MSVS 2008 & 2005! Бред какой то!!

Добавлено через 47 минут
Понял свою ошибку)) После Backslash не должно быть пробелов! вот вся ошибка!))) извините за беспокойство!
3
Байт
Эксперт C
16061 / 10330 / 1540
Регистрация: 24.12.2010
Сообщений: 19,459
14.12.2011, 11:00 #8
Цитата Сообщение от Infinity3000 Посмотреть сообщение
Понял свою ошибку)) После Backslash не должно быть пробелов! вот вся ошибка!)))
Здорово! А как ты это увидал? Ведь так просто глазом не увидишь.
И как я был прав 100 лет назад, когда в самопальном редакторе при записи обрубал конечные пробелы! Идея была проста, "если чего не видно - того и нет" Так же я поступил и с табуляцией, только наоборот.
1
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
14.12.2011, 13:03  [ТС] #9
Цитата Сообщение от Байт Посмотреть сообщение
Здорово! А как ты это увидал? Ведь так просто глазом не увидишь.
Чисто случайно) Просто хотел за коментить код поставил пробел, полезли ошибки, убрал пробел, все четко работает!!!

Кстати коментарии тоже не ставяться, ни однострочные // ни многосрочные /**/. Сразу лезут ошибки!
1
Байт
Эксперт C
16061 / 10330 / 1540
Регистрация: 24.12.2010
Сообщений: 19,459
14.12.2011, 14:24 #10
Infinity3000, Спасибо! Ошибочка (скорее это ошибочка разработчиков или их негуманное отношение к пользователям) такова, что без опыта не разберешься. Сам я с такими ситуациями не сталкивался. но в случае чего теперь буду знать куда копать.

Добавлено через 2 минуты

Не по теме:

Может это в FAQ поместить? Но это уже вопрос к модераторам.


И еще вопрос - на каком трансляторе эта бяка обнаружилась?
1
Bers
Заблокирован
14.12.2011, 14:26 #11
Байт, это от транслятора не зависит. Это правила работы с деррективами. Я сам офигел.
Действительно \ распространялась только на пробелы за ней, но не на то что после.
1
Байт
Эксперт C
16061 / 10330 / 1540
Регистрация: 24.12.2010
Сообщений: 19,459
14.12.2011, 14:31 #12
Попробовал на старинном BC 502 - и правда!
1
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
14.12.2011, 17:01  [ТС] #13
Теперь по поводу комментариев(насколько я разобрался)

Код можно можно комментировать только с помощью многострочных комментариев /* */ и они должны располагаться до Backslash!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define template_obmen(type)            \
void obmen_##type(type *mas,int n)      \
{                                       \
    for (int i = n - 1; i >= 1; --i)    \
    {                                   \
        for (int j = 0; j < i; ++j)     \
        {                               \
            if (mas[j] > mas[j + 1])    \
            {                           \
                int buble = mas[j]; /* меняем*/ \
                mas[j] = mas[j + 1];    /*элементы*/\
                mas[j + 1] = buble;     /*местами*/\
            }                           \
        }                               \
    }                                   \
}


// - не катят
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2011, 17:01
Привет! Вот еще темы с ответами:

Оформить в виде макроса и разместить их в отдельном модуле - C++
В одномерном массиве, состоящем из n вещественных элементов, вычислить: 1) обнулить все отрицательные элементы массива расположенные...

Упрощение вызова функции через #define - C++
Есть функция вида func(char*,int,int) Можно ли через define сделать, что бы в коде написать &quot;D15=1&quot;, а при сборке подставилось ...

Используя перегруженные функции и шаблон функции удалить из массива элемент по индексу - C++
Стоит следующая задача: Используя перегруженные функции и шаблон функции удалить из массива элемент по индексу. Функцию написал, но я...

При возврате объекта из функции пишет, что для объекта не определен констуктор копирования - C++
Пишу шаблонный класс матриц. Делаю, значит, переопределение оператора + для двух матриц одного типа. Но компилятор ругается на эту функцию ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.12.2011, 17:01
Ответ Создать тему
Опции темы

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