Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/19: Рейтинг темы: голосов - 19, средняя оценка - 5.00
5480 / 4875 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
1

Применение директивы #define с пустым полем текста.

29.01.2012, 11:25. Показов 3716. Ответов 17
Метки нет (Все метки)

Объясните, пожалуйста, следующее. Встречаю в заголовочном файле такие строки:
...
#define ASD
.....
class ASD Cls;
...
Как это понимать и для чего это используется?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.01.2012, 11:25
Ответы с готовыми решениями:

Директивы define
Рассматривая настоящую объемную программу, наткнулся на огромное количество файлов с длинным...

Аналог директивы #define в C#
Можно ли сделать , как в с++ константой #define SIZE 6 , вместо всех циклов, где ставлю 6 , чтобы...

вычислить (M+N)^2/2 использую директивы #define
Добрый день. Задать константы M и N и вычислить (M+N)^2/2 использую директивы #define.

Решения без директивы #define
Вот сама задача: Написать программу которая выводит таблицу значений функции y=-2.4*x*x +5*x-3 в...

17
31 / 31 / 2
Регистрация: 07.08.2011
Сообщений: 89
29.01.2012, 12:43 2
Ну в конкретно данном случае не для чего.
Обычно еще рядом при каких то условиях происходит не #define ASD, а например #define ASD static или еще что.
0
5480 / 4875 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.01.2012, 14:34  [ТС] 3
Цитата Сообщение от Teravisor Посмотреть сообщение
Ну в конкретно данном случае не для чего.
Обычно еще рядом при каких то условиях происходит не #define ASD, а например #define ASD static или еще что.
В частности, встретился с такими строками в заголовочных файлах wxWidgets. Например один из файлов: app.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
......
#ifndef _WX_APP_H_
#define _WX_APP_H_
 
#include "wx/event.h"
#include "wx/icon.h"
 
class WXDLLIMPEXP_FWD_CORE wxFrame;
class WXDLLIMPEXP_FWD_CORE wxWindow;
class WXDLLIMPEXP_FWD_CORE wxApp;
class WXDLLIMPEXP_FWD_CORE wxKeyEvent;
class WXDLLIMPEXP_FWD_BASE wxLog;
 
class WXDLLIMPEXP_CORE wxApp : public wxAppBase
{
public:
    wxApp();
    virtual ~wxApp();
........
Если пойти по цепочке обявлений какого-либо идентификатора (например, WXDLLIMPEXP_FWD_CORE), то закончится она #define с пустым полем текста. Непонятно, для чего это всё используется.
0
2552 / 1317 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.01.2012, 14:39 4
Цитата Сообщение от alsav22 Посмотреть сообщение
Если пойти по цепочке обявлений какого-либо идентификатора (например, WXDLLIMPEXP_FWD_CORE), то закончится она #define с пустым полем текста. Непонятно, для чего это всё используется.
Я полагаю, что таким образом проверяется, включены нужные хедеры, или нет.
0
5480 / 4875 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.01.2012, 14:45  [ТС] 5
Что, вообще, может присутствовать вместо этих идентификаторов в тексте программы в объявлениях классов после работы препроцессора? Например, что может стоять вместо WXDLLIMPEXP_FWD_CORE при таком объялении класса: class WXDLLIMPEXP_FWD_CORE wxFrame; ?
0
2552 / 1317 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.01.2012, 14:54 6
alsav22, там ничего не будет. Просто, если данная константа не будет существовать, то код не скомпилируется.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
#define AAA
 
struct AAA A
{
    A() { std::cout << "A all ok" << std::endl; }
};
 
/*struct BBB B
{
    B() { std::cout << "B all ok" << std::endl; }
};*/
 
int main()
{
    A a;
    //B b;
    return 0;
}
Может так нагляднее будет.
0
385 / 229 / 12
Регистрация: 06.07.2011
Сообщений: 512
29.01.2012, 15:08 7
используется во избежание повторной компиляции хедеров в случае если каким-то образом они включаются несколько раз.

если есть конструкция
C++
1
2
3
4
5
6
#ifndef _WX_APP_H_
#define _WX_APP_H_
 
//какой-то код
 
#endif
то код будет учтен один раз - при первой встрече. если где-то в пределах единицы трансляции вновь встретиться включение этого хедера, то условие #ifndef _WX_APP_H_ не пропустит дальше.
по-хорошему надо все хедеры так обрамлять
0
Делаю внезапно и красиво
Эксперт С++
1311 / 1226 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
29.01.2012, 15:12 8
Цитата Сообщение от alsav22 Посмотреть сообщение
WXDLLIMPEXP_CORE
В библиотеке эта константа будет заменяться на __declspec(dllexport), в использующем коде на __declspec(dllimport). А если код будет использоваться только в том же модуле, где и реализуется, то делается вид, что ничего не написано и никакие функции не экспортируются.
0
soon
29.01.2012, 15:18
  #9

Не по теме:

Paporotnik, вопрос-то несколько не об этом. ТС интересовался, зачем пишут так

C++
1
class SOMETHING MyClass

0
5480 / 4875 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.01.2012, 15:18  [ТС] 10
Если бы простой пример, как это используется, а то идея по прежнему непонятна. Зачем записывать в объявлении класса то, что препроцессор убирает перед компиляцией?
0
Делаю внезапно и красиво
Эксперт С++
1311 / 1226 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
29.01.2012, 15:25 11
Цитата Сообщение от alsav22 Посмотреть сообщение
Если бы простой пример
Чуть выше я всё подробно описал. Вот пример

// Для dll
C++
1
#define ABCD __declspec(dllexport)
// Для ехе
C++
1
#define ABCD __declspec(dllimport)
// Или
C++
1
#define ABCD
И определение класса
C++
1
class ABCD MyClass { ...  };
В зависимости от использования, ABCD может как определяться, так и пропускаться.
0
5480 / 4875 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.01.2012, 15:30  [ТС] 12
Или, вопрос проще, может ли между словом class и именем класса в тексте программы перед компиляцией (после того, как препроцессор отработал) что-то быть и если да, то что?
0
Делаю внезапно и красиво
Эксперт С++
1311 / 1226 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
29.01.2012, 15:33 13
Цитата Сообщение от alsav22 Посмотреть сообщение
может ли между словом class и именем класса
Может. Читай выше.
1
Эксперт С++
5044 / 3105 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
29.01.2012, 15:35 14
Ещё вариант родился:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#define MACRO_NS
 
namespace NameSpace
{
    class Foo;
}
 
#if defined(MACRO_NS)
#define NS NameSpace::
#else
#define NS
#endif
 
class NS Foo
{
};
 
int main()
{
    NS Foo bar;
    
    return 0;
}
1
5480 / 4875 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.01.2012, 10:37  [ТС] 15
Благодарю всех!

Добавлено через 18 часов 32 минуты
Цитата Сообщение от Deviaphan Посмотреть сообщение
Чуть выше я всё подробно описал. Вот пример

// Для dll
C++
1
#define ABCD __declspec(dllexport)
// Для ехе
C++
1
#define ABCD __declspec(dllimport)
// Или
C++
1
#define ABCD
И определение класса
C++
1
class ABCD MyClass { ...  };
В зависимости от использования, ABCD может как определяться, так и пропускаться.
Вопрос в догонку. Если сработало определение: #define ABCD __declspec(dllimport), как будет выглядеть строка: class ABCD MyClass { ... }; ? Что, в конечном счёте, окажется на месте ABCD перед компиляцией?
0
Эксперт С++
5044 / 3105 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
30.01.2012, 10:43 16
alsav22, ровно то, что стоит после ABCD в макросе.
0
5480 / 4875 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.01.2012, 11:31  [ТС] 17
Цитата Сообщение от silent_1991 Посмотреть сообщение
alsav22, ровно то, что стоит после ABCD в макросе.
Это-то понятно. Что это означает для данного класса? Или для компилятора? Или для чего другого?
0
Эксперт С++
5044 / 3105 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
30.01.2012, 11:35 18
alsav22, в гугле забанили? http://msdn.microsoft.com/ru-r... k134d.aspx
Стоит отметить, что это нестандартное расширение, мелкомягкая поделка.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.01.2012, 11:35

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

Удаление строк с пустым полем
Есть таблица в ней много полей, как удалить СТРОКИ, в которых конкретная строка пустая?

Не вытаскивались строки с пустым полем
Доброго времени суток При выборке из таблицы нужно чтобы пропускались строки, где определенное...

Нюансы использования директивы препроцессора #define: найти и исправить ошибки в коде
Добрый день. Помогите, пожалуйста, в решении задачи. Задача простая, но хочется разобраться с...

Вывод в DBGrid записей с пустым полем
Access+ADO На форме лежит CheckBox, по которому должен фильтроваться DBGrid. Типа, if checked...


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

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

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