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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.01.2012, 11:25     Применение директивы #define с пустым полем текста. #1
Объясните, пожалуйста, следующее. Встречаю в заголовочном файле такие строки:
...
#define ASD
.....
class ASD Cls;
...
Как это понимать и для чего это используется?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2012, 11:25     Применение директивы #define с пустым полем текста.
Посмотрите здесь:

Директивы компилятора C++
решения без директивы #define C++
C++ Директивы препроцессора
C++ Директивы и их свойства
C++ Директивы компилятора
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Teravisor
30 / 30 / 3
Регистрация: 07.08.2011
Сообщений: 89
29.01.2012, 12:43     Применение директивы #define с пустым полем текста. #2
Ну в конкретно данном случае не для чего.
Обычно еще рядом при каких то условиях происходит не #define ASD, а например #define ASD static или еще что.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.01.2012, 14:34  [ТС]     Применение директивы #define с пустым полем текста. #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 с пустым полем текста. Непонятно, для чего это всё используется.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.01.2012, 14:39     Применение директивы #define с пустым полем текста. #4
Цитата Сообщение от alsav22 Посмотреть сообщение
Если пойти по цепочке обявлений какого-либо идентификатора (например, WXDLLIMPEXP_FWD_CORE), то закончится она #define с пустым полем текста. Непонятно, для чего это всё используется.
Я полагаю, что таким образом проверяется, включены нужные хедеры, или нет.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.01.2012, 14:45  [ТС]     Применение директивы #define с пустым полем текста. #5
Что, вообще, может присутствовать вместо этих идентификаторов в тексте программы в объявлениях классов после работы препроцессора? Например, что может стоять вместо WXDLLIMPEXP_FWD_CORE при таком объялении класса: class WXDLLIMPEXP_FWD_CORE wxFrame; ?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.01.2012, 14:54     Применение директивы #define с пустым полем текста. #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;
}
Может так нагляднее будет.
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
29.01.2012, 15:08     Применение директивы #define с пустым полем текста. #7
используется во избежание повторной компиляции хедеров в случае если каким-то образом они включаются несколько раз.

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

Не по теме:

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

C++
1
class SOMETHING MyClass

alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.01.2012, 15:18  [ТС]     Применение директивы #define с пустым полем текста. #10
Если бы простой пример, как это используется, а то идея по прежнему непонятна. Зачем записывать в объявлении класса то, что препроцессор убирает перед компиляцией?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
29.01.2012, 15:25     Применение директивы #define с пустым полем текста. #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 может как определяться, так и пропускаться.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.01.2012, 15:30  [ТС]     Применение директивы #define с пустым полем текста. #12
Или, вопрос проще, может ли между словом class и именем класса в тексте программы перед компиляцией (после того, как препроцессор отработал) что-то быть и если да, то что?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
29.01.2012, 15:33     Применение директивы #define с пустым полем текста. #13
Цитата Сообщение от alsav22 Посмотреть сообщение
может ли между словом class и именем класса
Может. Читай выше.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
29.01.2012, 15:35     Применение директивы #define с пустым полем текста. #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;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.01.2012, 10:37  [ТС]     Применение директивы #define с пустым полем текста. #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 перед компиляцией?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
30.01.2012, 10:43     Применение директивы #define с пустым полем текста. #16
alsav22, ровно то, что стоит после ABCD в макросе.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.01.2012, 11:31  [ТС]     Применение директивы #define с пустым полем текста. #17
Цитата Сообщение от silent_1991 Посмотреть сообщение
alsav22, ровно то, что стоит после ABCD в макросе.
Это-то понятно. Что это означает для данного класса? Или для компилятора? Или для чего другого?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.01.2012, 11:35     Применение директивы #define с пустым полем текста.
Еще ссылки по теме:

Директивы define C++
C++ Директивы препроцессора
C++ Директивы предпроцессора 2 задачи

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
30.01.2012, 11:35     Применение директивы #define с пустым полем текста. #18
alsav22, в гугле забанили? http://msdn.microsoft.com/ru-ru/library/a90k134d.aspx
Стоит отметить, что это нестандартное расширение, мелкомягкая поделка.
Yandex
Объявления
30.01.2012, 11:35     Применение директивы #define с пустым полем текста.
Ответ Создать тему
Опции темы

Текущее время: 03:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru