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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
#1

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

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

Объясните, пожалуйста, следующее. Встречаю в заголовочном файле такие строки:
...
#define ASD
.....
class ASD Cls;
...
Как это понимать и для чего это используется?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2012, 11:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Применение директивы #define с пустым полем текста. (C++):

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

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

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

Директивы препроцессора Составить программу, использующую директивы препроцессора - C++
1) Задать константы M1,M2,...,M5 и вычислить M1+ 2M2 + 3M3 + 4M4 + 5M5 2) С помощью директив #if, #else, #elif осуществлять выбор строк...

Работа с памятью: можно ли в массив объектов с полем типа "Родитель", вписать объекты с полем типа "Потомок" - C++
Здравствуйте. Предположим, что у нас есть массив из структур в которых находиться класс Item и число Count. Можно ли на место Item записать...

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

17
Teravisor
31 / 31 / 3
Регистрация: 07.08.2011
Сообщений: 89
29.01.2012, 12:43 #2
Ну в конкретно данном случае не для чего.
Обычно еще рядом при каких то условиях происходит не #define ASD, а например #define ASD static или еще что.
0
alsav22
5426 / 4821 / 442
Регистрация: 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
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.01.2012, 14:39 #4
Цитата Сообщение от alsav22 Посмотреть сообщение
Если пойти по цепочке обявлений какого-либо идентификатора (например, WXDLLIMPEXP_FWD_CORE), то закончится она #define с пустым полем текста. Непонятно, для чего это всё используется.
Я полагаю, что таким образом проверяется, включены нужные хедеры, или нет.
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.01.2012, 14:45  [ТС] #5
Что, вообще, может присутствовать вместо этих идентификаторов в тексте программы в объявлениях классов после работы препроцессора? Например, что может стоять вместо WXDLLIMPEXP_FWD_CORE при таком объялении класса: class WXDLLIMPEXP_FWD_CORE wxFrame; ?
0
soon
2542 / 1307 / 81
Регистрация: 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
Paporotnik
383 / 227 / 7
Регистрация: 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
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 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
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.01.2012, 15:18  [ТС] #10
Если бы простой пример, как это используется, а то идея по прежнему непонятна. Зачем записывать в объявлении класса то, что препроцессор убирает перед компиляцией?
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 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
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.01.2012, 15:30  [ТС] #12
Или, вопрос проще, может ли между словом class и именем класса в тексте программы перед компиляцией (после того, как препроцессор отработал) что-то быть и если да, то что?
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
29.01.2012, 15:33 #13
Цитата Сообщение от alsav22 Посмотреть сообщение
может ли между словом class и именем класса
Может. Читай выше.
1
silent_1991
Эксперт С++
4986 / 3043 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
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
alsav22
5426 / 4821 / 442
Регистрация: 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
30.01.2012, 10:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.01.2012, 10:37
Привет! Вот еще темы с ответами:

Не вытаскивались строки с пустым полем - PHP БД
Доброго времени суток При выборке из таблицы нужно чтобы пропускались строки, где определенное поле пустое. select id from table where...

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

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

Выбрать значения с пустым дополнительным полем в первой таблице, которого нет во второй? - MS Access
Подскажите, пожалуйста, Как выбрать страховые номера организаций в таблице firms, у которых поле &quot;сдан отчёт&quot; с типом &quot;дата&quot; пустое, но...


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

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

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