powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Полезные макросы для VC
24 сообщений из 24, страница 1 из 1
Полезные макросы для VC
    #32378238
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте, выкладывайте, не стесьняйтесь :-)
У меня пока два, один для переключения между h и cpp,
другой для комментирования/раскомментирования.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
Sub Switch()
'////////////////////////////////////////////
'Nooruddin Kapasi  1998 .
'DESCRIPTION: Switch Between Header and cpp
'////////////////////////////////////////////
Dim myDocument
Dim a
Dim b
Dim Flag
Dim Flag1
Flag1 =  0 
Flag =  1 
a = ActiveDocument.FullName
tmp=instr( 1 , a, ".cpp" ,  1 )
If tmp Then
        b = Left(a, Len(a) -  3 ) +  "h" 
        Flag1 =  1 
Else
tmp=instr( 1 , a, ".h" ,  1 )
If tmp Then
        b = Left(a, Len(a) -  1 ) +  "cpp" 
        Flag1 =  1 
End If
End If
For Each myDocument In Application.Documents
    If myDocument.FullName = b Then
        myDocument.Active = True
        Flag =  0 
        Exit For
        End If
Next
If Flag And Flag1 Then
    Dim FileSystem
    Set FileSystem = CreateObject(  "Scripting.FileSystemObject"  )
    If FileSystem.FileExists( b ) Then
        Documents.Open b,  "Text" 
    else
		' Bev 2003
		' Try to open it in /source /include subfolders
		tmp = InStrRev( b,  "\" , - 1 ,  1  )
		If tmp Then
			Dim file, path, dest
			file = Right( b, Len(b) - tmp )
			path = Left( b, tmp -  1  )

			tmp = InStrRev( path,  "\" , - 1 ,  1  )
			If tmp Then
				dest = Right( path, Len(path ) - tmp )
				path = Left( path, tmp -  1  )

				If LCase(dest) =  "source"  OR LCase(dest) =  "include"  Then
					If LCase(dest) =  "source"  Then
						dest =  "include" 
					Else
						dest =  "source" 
					End If
					b = path +  "\"  + dest +  "\"  + file
					If FileSystem.FileExists( b ) Then
						Documents.Open b,  "Text" 
					End If
				End If
			End If
		End If
    End If
    Set FileSystem = Nothing
End If

End Sub

Sub Comment()
'DESCRIPTION: Comment / uncomment macro
	CommentBlock ()
End Sub

Sub CommentBlock ()
'DESCRIPTION: Comments or uncomments a selected block of text.
	Dim win
	set win = ActiveWindow
	if win.type <>  "Text"  Then
	  MsgBox  "This macro can only be run when a text editor window is active." 
	else
		If Left( ActiveDocument.Selection,  2  ) =  "//"  or Left( ActiveDocument.Selection,  2  ) =  "/*" Then
			UncommentBlock()
		Else			
			If InStr( ActiveDocument.Selection, vbCr ) > 0 then
				ActiveDocument.Selection.ReplaceText "^", "//", dsMatchRegExp
			Else
				ActiveDocument.Selection = "/* " + ActiveDocument.Selection + " */ "
			End If
		End If
	End If
End Sub

Sub UnCommentBlock ()
'DESCRIPTION: Uncomments a selected block of text.
  Dim win
  set win = ActiveWindow
  if win.type <>  "Text"  Then
	MsgBox  "This macro can only be run when a text editor window is active." 
  else
	ActiveDocument.Selection.ReplaceText  "\/\* " ,  "", dsMatchRegExp
	ActiveDocument.Selection.ReplaceText " \*\/ ", "  ", dsMatchRegExp
	ActiveDocument.Selection.ReplaceText " ^// ", " ", dsMatchRegExp
  End If
End Sub
...
Рейтинг: 0 / 0
Полезные макросы для VC
    #32380626
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поскольку никто не отзывается, предлагаю включить в тему и макросы С++ (параметрические #define).

Из любимых:

1.
#define DO_CASE(lCondition) if(lCondition){
#define CASE(lCondition) }else if(lCondition){
#define DEFAULT }else{
#define ENDCASE }
т.е. перекрывается ограничение опертора case, что сравнивать можно только значения одной переменной с константами. Clipper forever! :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
DO_CASE(x ==  0 )
    <операторы>
CASE(x >  0  && y ==  0 )
    <операторы>
CASE(x >  0  && y >  0 )
    <операторы>
DEFAULT
    <операторы>
ENDCASE

2.
#define RFOR(rR) for(;!(rR).IsEOF();(rR).MoveNext())
Для прохода по recordset'у. Не тратится строчка на MoveNext().
Код: plaintext
1.
RFOR(rTable)
    wList.AddSTring(rTable.m_Field);

3.
#define ISNULL(rR,mF) (rR).IsFieldNull(&(rR).mF)
При вызове IsFieldNull() не приходится два раза повторять имя recordset'a.
if(ISNULL(rTable,m_Field)) ...
а не
if(rTable.IsFieldNull(&rTable.m_Field)) ...
...
Рейтинг: 0 / 0
Полезные макросы для VC
    #32380656
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой Вэй

меня учили 2м вещам
первое - никогда не эмулировать другие языки на C++ с помощью препроцессора
второе - никогда не использовать макросы в C++ - там для этого есть templates

С уважением...
...
Рейтинг: 0 / 0
Полезные макросы для VC
    #32380676
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну почему же :)

иногда хочется покосить на паскаль :))

#define begin {
#define end }
#define procedure void

procedure Test(int a = 0)
begin
// oops :))
end

да ну
это ак просто шютка я так не делаю
____
...
Рейтинг: 0 / 0
Полезные макросы для VC
    #32380685
maratka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот мои макросы шутка конечно
...
Рейтинг: 0 / 0
Полезные макросы для VC
    #32380720
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
funikovyuri
1.1. А при чём тут другие языки?
1.2. И никогда не креститься двумя пальцами, а яйцо разбивать только с острого конца...

2.1. И ASSERT ты не испольуешь, и TRACE? BOOL, DWORD?
2.2. Ну расскажи, как заменить хотя бы один из вышеописнных макросов на template.
...
Рейтинг: 0 / 0
Полезные макросы для VC
    #32380740
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я считаю что в некоторых вещях макросы необходимая вещь ...

_________________________________________________________
ой сейчас запинают , так как нету убедительных аргументов
____
...
Рейтинг: 0 / 0
Полезные макросы для VC
    #32380798
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой Вэй

1.1. А при чём тут другие языки?
Ты предложил эмулировать синтаксис чего-то на C++ с помощью макроса - это не есть гут

2.1. И ASSERT ты не испольуешь, и TRACE? BOOL, DWORD?
Я конечно же слишком категорично заявил - trace/assert конечно же допустимы - как и некоторые другие вспомогательные макросы - служащие управлению процессом компиляции - но не логики программы - твой же rfor к ним не относиться и это типичная задача для шаблона - который выполнит ее более качественно и безопасно с т.з. типов
Далее - BOOL я не использую - уже давно есть bool ;)
DWORD - тяжелое наследие MS Win32 - не мне тебя учить что есть typedef ...

JibSkeart

А я считаю что в некоторых вещях макросы необходимая вещь ...
В каких например? Кроме тех что я уже описал...
...
Рейтинг: 0 / 0
Полезные макросы для VC
    #32380891
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
funikovyuri

1.1 Ты предложил эмулировать синтаксис чего-то на C++ с помощью макроса — нет, я просто объяснил, откуда у этого растут ножки.
это не есть гут — см. 1.2. Пока ты не объяснил причину, это всего лишь предрассудок. Мало ли кого чему учили...

макросы - служащие управлению процессом компиляции, но не логики программы — аналогично.

BOOL я не использую - уже давно есть bool ;)
Это не одно и то же, и ты это знаешь. Я тоже предпочитаю bool, потому что оно синенькое :) , но есть ситуации, когда оно хуже.

Ну есть typedef, ну и что? И для транслятора, и для человека, читающего текст программы — никакой разницы. (если есть, объясни)

На 2.2. ты не ответил, и это самое главное.
...
Рейтинг: 0 / 0
Полезные макросы для VC
    #32380977
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой Вэй

Начнем с самого главного
Код: plaintext
1.
2.
3.
4.
5.
#define RFOR(rR) for(;!(rR).IsEOF();(rR).MoveNext()) 

RFOR(rTable)
    wList.AddSTring(rTable.m_Field);



Это вообще не требует ни шаблонов ни макросов и делается с помощью функции вида
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
typedef void (*F) (TDataSet*ds)

void RFOR( TDataSet *rR, F f)
{
for(;!(rR).IsEOF();(rR).MoveNext()) 
              f(rTable);
}

RFOR(fTable);

Если интересуешься чем-то по сложнее - то см. std::foreach<>

Я уже заколебался везде Голуба вставлять
Глава 8.З(H). Шаблоны

Ну есть typedef, ну и что? И для транслятора, и для человека, читающего текст программы — никакой разницы.

45.2. Не используйте заглавных букв в именах типов, созданных при помощи typedef.

Пока ты не объяснил причину, это всего лишь предрассудок.

Наши знания вообще - сплошные предрассудки :)
...
Рейтинг: 0 / 0
Полезные макросы для VC
    #32381021
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--funikovyuri

--А я считаю что в некоторых вещях макросы необходимая вещь ...
--В каких например? Кроме тех что я уже описал...

темплейтные функции не поддерживают переменное число параметров, особенно когда еще переменое число типов как аргументы функции.
...
Рейтинг: 0 / 0
Полезные макросы для VC
    #32381120
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lepsik
темплейтные функции не поддерживают переменное число параметров, особенно когда еще переменое число типов как аргументы функции.

А разве это задача для макроса, а не для функции?
...
Рейтинг: 0 / 0
Полезные макросы для VC
    #32381388
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Один раз было :) Каюсь :)

#define GetCSrc(h,i,s) strcpy(s,"");SendMessage(GetDlgItem(h,i),CB_GETLBTEXT,SendMessage(GetDlgItem(h,i),CB_GETCURSEL,0,0),(long)s)

#define GetLSrc(h,i,s) strcpy(s,"");SendMessage(GetDlgItem(h,i),LB_GETTEXT,SendMessage(GetDlgItem(h,i),LB_GETCURSEL,0,0),(long)s)
...
Рейтинг: 0 / 0
Полезные макросы для VC
    #32381392
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2funikovyuri

я это просто так сказал :))
хотел увидить реакцию , и бурно развивающуюся дискуссию
____
...
Рейтинг: 0 / 0
Полезные макросы для VC
    #32382969
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
funikovyuri
Действительно, тот пример использования RFOR, который я привёл, легко реализуется в виде функции. Но с помощью этой функции можно сделать только это, а макрос имеет обобщённый характер.
Код: plaintext
1.
2.
3.
RFOR(rR)
{
    <любой набор операторов>
}
Наверно, если постараться, можно налететь на какой-нибудь сторонний эффект. Мне пока не удавалось :)

И не надо "клясться словами учителя".

Ссылки, которые ты привёл, я прочитал. Такое впечатление, что автор программирует в раю, и у него нет ни сроков, ни необходимости, чтобы программа работала, а только бы следовать абстрактным принципам.
Например:
Одна из наиболее фундаментальных заповедей объектно-ориентированного проектирования запрещает оставлять незащищенными данные-члены в определении класса.
Ха-ха. То есть если у меня в классе 20 переменных-членов, то я должен ещё объявить 40 функций. НЕ ДОЖДЁТЕСЬ!
Кстати, в половине случаев, когда я сознательно делал члены защищёнными, чтобы отловить, где они меняются, ошибка содержалась в теле функций данного класса, т.е. защита не помогала.

У макроса DO_CASE... есть ещё достоинства:
1) не надо писать в каждой ветке break, теряя строчку и рискуя его пропустить;
2) можно спокойно объявлять переменные внутри веток, не вставляя пару {} (теряются две строки) и не уезжая вправо.
И один недостаток: он теоретически работает медленнее, чем switch. Да, и ещё он не синенький...
...
Рейтинг: 0 / 0
Полезные макросы для VC
    #32383007
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой Вэй \r
\r
Но с помощью этой функции можно сделать только это, а макрос имеет обобщённый характер.\r
\r
В таком случае нужен template относительно этого "обобщенного действия"\r
Side effects - это то чего следует избегать и отдавать на проверку компилятору - это генеральная стратегия - понятно что будут исключения - но они только подтверждают правило - т.е., если хочешь, пусть все мои замечания читаются как "рекомендации" - т.е. если знаешь что делаешь - делай - но сначала необходимо убедиться что нет более удобных средств\r
\r
Ха-ха. То есть если у меня в классе 20 переменных-членов, то я должен ещё объявить 40 функций. НЕ ДОЖДЁТЕСЬ! \r
\r
На повторение меня не хватит\r
/topic/66973
...
Рейтинг: 0 / 0
Полезные макросы для VC
    #32383173
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В таком случае нужен template относительно этого "обобщенного действия"
Пример — в студию!

Side effects - это то чего следует избегать и отдавать на проверку компилятору
В данной ситуации нет ничего, чего не мог бы проверить компилятор.
...
Рейтинг: 0 / 0
Полезные макросы для VC
    #32383260
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой Вэй

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
template <class F>
void RFOR( TDataSet *rR, F f)
{
for(;!(rR).IsEOF();(rR).MoveNext()) 
              f(rTable);
}

RFOR(fTable);


В данной ситуации нет ничего, чего не мог бы проверить компилятор.
макрос - это средство сродки cut/paste - какая там может быть проверка у компилятора?
...
Рейтинг: 0 / 0
Полезные макросы для VC
    #32383672
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как какая? Препроцессор развернёт, компилятор проверит...
...
Рейтинг: 0 / 0
Полезные макросы для VC
    #32383687
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно - ты можешь хотя бы сформулировать что делает твой макрос? Т.е. просто сказать - я думаю врядли - так как он может делать что угодно - он не несет информации о поведении
...
Рейтинг: 0 / 0
Полезные макросы для VC
    #32384570
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только сейчас заметил твой пример (<class F>). Правда, не совсем понятно, что значит f(rR) — вызов конструктора?
Но тогда набор действий, который я могу выполнить внутри такой template-функции, должен быть написан в функции какого-то класса. Более того, этот класс не будет знать о специфике rR (rR — не CRecordset, а порождённый от него).

Интересно - ты можешь хотя бы сформулировать что делает твой макрос?
Могу, иначе как бы я им пользовался? (посмотрел — 80 раз в одной программе, 70 раз в другой).
Этот макрос обеспечивает проход по recordset'у, от текущей записи до конца.
При этом он экономит силы и время пишущего, позволяя не писать второй раз имя переменной-recordset'a, а также MoveNext и IsEOF.
Мне кажется, что читаемость программы этот макрос повышает, а не понижает.

Т.е. просто сказать - я думаю врядли - так как он может делать что угодно - он не несет информации о поведении.
Извини, этой фразы я просто не понял.

Готов прекратить эту дискуссию...
...
Рейтинг: 0 / 0
Полезные макросы для VC
    #32385514
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё дело в том, какая у вас цель. Макросы полезны когда требуется Realtime, дабы не тратится на обращения к стеку и тому подобное. С компилятором всё-таки могут быть проблемы.

Не помню точно, но вот чё-тоя в макросе такое написал, что ошибка у меня была на следующей строке...

Ой Вэйзапрещает оставлять незащищенными данные-члены в определении класса.- воистину фигня. Кому надо, тот доберётся. И ломаются закрытые и открытые одинаково часто :)

Ой ВэйИ один недостаток: он теоретически работает медленнее, чем switch. Да, и ещё он не синенький... Возрадуйся! :) Тут мы тебе поможем.(Если ты в VC работаешь). Заходишь в опции, в закладку "формат". Ищешь user defined keywords, ставишь синенький. Потом идёшь в
Visual Studio\Common\MSDev98\Bin\
и создаёшь там файл usertype.dat
В этом файле построчно пишешь все свои юзерские кейворды.
Перезапускаешь студию.
Счастье.
...
Рейтинг: 0 / 0
Полезные макросы для VC
    #32385695
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой Вэй

Правда, не совсем понятно, что значит f(rR)

Предпологается что F - это или функция или функтор - тогда f(rR) - это вызов этой функции либо оператора () этого функтора

Более того, этот класс не будет знать о специфике rR (rR — не CRecordset, а порождённый от него).

Там везде rR - это указатель - так что еще как будет

Мне кажется, что читаемость программы этот макрос повышает, а не понижает.

Да, но он ничего не гарантирует с т.з. поведения

Готов прекратить эту дискуссию...
Я тоже :)

CEMb

Макросы полезны когда требуется Realtime, дабы не тратится на обращения к стеку и тому подобное

А про inline ты не забываешь?
...
Рейтинг: 0 / 0
Полезные макросы для VC
    #32386190
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помню, помню. Надо посмотреть в ассемблере, как это выглядит.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Полезные макросы для VC
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]