Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> # & ## - ваша практика, с ними 
V
    Опции темы
Rickert
Дата 15.6.2007, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Есть два оператора препроцессора "#" & "##".
Я никак не могу представить случая, когда в них есть необходимость.
У вас были такие случаи? Или просто пример приведите, пожалуйста.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Ulysses4j
Дата 15.6.2007, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

Репутация: 4
Всего: 10



У Эккеля в TIC++, vol.1, chap.9 есть подраздел "More preprocessor features"; говорит, # - для дебага и трассировки кода - самое то, а ## может повысить ридабилити...
Цитата
These two features are especially useful when writing debug code. Thus,
Код
#define DEBUG(x) cout << #x " = " << x << endl

This prints the value of any variable. You can also get a trace that prints out the statements as they execute:
Код
#define TRACE(s) cerr << #s << endl, s

The #s stringizes the statement for output, and the second s reiterates the statement so it is executed. 

Token pasting

Token pasting, implemented with the ## directive, is very useful when you are manufacturing code. It allows you to take two identifiers and paste them together to automatically create a new identifier. For example,
Код
#define FIELD(a) char* a##_string; int a##_size
class Record {
  FIELD(one);
  FIELD(two);
  FIELD(three);
  // ...
}; 

Each call to the FIELD( ) macro creates an identifier to hold a character array and another to hold the length of that array. Not only is it easier to read, it can eliminate coding errors and make maintenance easier.



--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
FiMa1
Дата 15.6.2007, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Для управления строками в макросах сучествует 2 оператора - оператор взятия в кавычки '#' и оператор контактенации '##'. Оператор '#' берет в кавычки следуючие за ним символы до очередного пробела, например, если объявить так:
Код
#define PRINT(x) cout << #x

тогда
Код
PRINT( a string );

равносильно
Код
cout << " a string ";

Оператор '##' используется для контактенации строк, то есть "склеивания" нескольких строк в одну. Например, у вас есть несколько функций с именами MyFirstFunc(), MySecondFunc(), MyThirdFunc() и т.д. Для их вызова можно определить макрос:
Код
#define CALLFUNC(x) My##x##Function()

и вызывать функции MyFirstFunc(), MySecondFunc() ,MyThirdFunc() и т.д. макросом CALLFUNC:
Код
CALLFUNC(First); 
CALLFUNC(Second); 

См. также пример в аттаче.

У многих компиляторов есть ряд встроенных макросов. Наиболее распостраненные - __DATE__ , __TIME__ , __LINE__ , __FILE__ , которые заменяются текущей (на время компиляции) датой, временем, номером строки и именем исходного файла соответственно. Встроенные макросы можно использовать без объявления: 
Код
cout << "Compiled on " << __DATE__ << " "<< __ TIME__;

Результат:
Код
compiled on Sep 52001 23:49:55


Это сообщение отредактировал(а) FiMa1 - 15.6.2007, 08:33

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  macroses.rar 0,53 Kb
PM   Вверх
MAKCim
Дата 15.6.2007, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



уже как-то приводил пример
1.
Код

#define SYMBOL(name, value) \
    __asm__(#name" = %0" : : "i" (value))

2. 
вот оформление экспорта символа
Код

#define PREFIX __EXPORT_PREFIX
#define __EXPORT_SECTION .k2export

#define CAT(a, b) \
    a ## b

#define LABEL(name) \
    CAT(PREFIX, name)

#define EXPORT(name, address) \
.section __EXPORT_SECTION, "a", @progbits; \
    .long __EXPORT_SIZE; \
    .long name; \
LABEL(name); \
    .asciz #name; \
__EXPORT_SIZE = . - LABEL(name)

использование
Код

.text
task_switch:
    ljmp $1 << 3, 0x00000000
    ret
EXPORT(task_switch)

в итоге в скомпонованном образе (флрматном или бинарном) появится секция .k2export, которая содержит
1) Размер символического представления символа
2) Адрес символа
3) Имя символа

Это сообщение отредактировал(а) MAKCim - 15.6.2007, 09:48


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Rickert
Дата 15.6.2007, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Цитата(FiMa1 @  15.6.2007,  08:31 Найти цитируемый пост)
равносильно
Код
cout << " a string ";

Пробела после "string" не будет.

А вообщем: solved smile


Это сообщение отредактировал(а) Rickert - 15.6.2007, 13:46


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0519 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.