Как я могу сделать что-то похожее на следующий код C в VB 6?Режим отладки В VB 6?
#ifdef _DEBUG_
// do things
#else
// do other things
#end if
Как я могу сделать что-то похожее на следующий код C в VB 6?Режим отладки В VB 6?
#ifdef _DEBUG_
// do things
#else
// do other things
#end if
Это почти то же, что и на других языках, к которым вы привыкли. Синтаксис выглядит следующим образом:
#If DEBUG = 1 Then
' Do something
#Else
' Do something else
#End If
Это легко запомнить, если вы помните, что синтаксис точно так же, как и другие заявления потока управления в VB 6, за исключением того, что во время компиляции условных начать с фунтом знак (#
).
Трюк фактически определяет константу DEBUG
(или что-то еще), потому что я уверен, что по умолчанию не определено. Есть два стандартных способа сделать это:
Используйте кнопки #Const
ключевое слово, чтобы определить константу в верхней части каждого исходного файла. Определение, которое вы устанавливаете таким образом, действует во всем исходном модуле. Это будет выглядеть примерно так:
#Const DEBUG = 1
Задайте константу в свойствах проекта. Это определит константу, которая действительна на протяжении всего проекта (и, вероятно, это то, что вы хотите для индикатора режима «Отладка»).
Для этого нужно ввести что-то вроде следующего в «условной компиляции Константы» текстовое поле на вкладке «Make» диалогового окна «Свойства проекта»:
DEBUG = 1
Вы можете определить несколько констант в этом диалоге, разделяя каждый из них с толстой кишки (:
):
DEBUG = 1 : VERSION2 = 1
Помните, что любая константа, не определено считается равным 0.
Коди рассказал вам об условной компиляции. Я хотел бы добавить, что если вы хотите по-разному вести себя при отладке в среде IDE (например, отключите собственную обработку ошибок, чтобы ошибки IDE ловушки) вам не нужно условная компиляция. Вы можете обнаружить IDE во время выполнения, как это.
On Error Resume Next
Debug.Print 1/0
If Err=0 then
'Compiled Binary
Else
'in the IDE
End if
Это работает, потому что Debug.Print опущен в скомпилированном EXE.
Это хороший совет, но вы, вероятно, захотите отключить 'On Error Resume Next' в какой-то момент, а? :-) –
Почему? On Error Resume Next - лучшая стратегия обработки ошибок - пользователь не видит ошибки таким образом :) Ну, по крайней мере, пока он не посмотрит на фактические данные ... Более серьезно, мы просто используем глобальную переменную (inEXE) и инициализировать его во время запуска программы; то же самое для флагов отладки и трассировки. Да, этот подход не использует директивы препроцессора, но накладные расходы времени выполнения (от проверки различных флагов) незначительны по сравнению с доступом к базе данных или даже простым графическим интерфейсом. – Arvo
Вам бы лучше объявить глобальный флаг и выполнить эту проверку где-то в начале Sub Main. Таким образом, вы можете проверить наличие отладки с минимальными накладными расходами. –
Для достижения такого же эффекта, как MarkJ, но с обработкой ошибок, вы можете использовать следующий код.
Public Function GetRunningInIDE() As Boolean
Dim x As Long
Debug.Assert Not TestIDE(x)
GetRunningInIDE = x = 1
End Function
Private Function TestIDE(x As Long) As Boolean
x = 1
End Function
Когда вы работаете внутри IDE, там будет дополнительные накладные расходы вызова функции (что смехотворно мало). При компиляции это оценивается простым сравнением чисел.
+1. Это похоже на то, что мы фактически используем на работе, но я не публиковал этот код, потому что он принадлежит моему работодателю. – MarkJ
Это мой короткий и стабильный код. Я думаю, что это лучше условных констант, потому что вам не нужно менять его на каждое усложнение.
Public Function InIDE() As Boolean
On Error Resume Next
Debug.Print 0/0
InIDE = Err.Number <> 0
End Function
+1 Лучший ответ, потому что он короткий и приятный и не требует изменения свойств проекта, когда вам нужно перекомпилировать. – Keith
Это выглядит фантастическим, только один вопрос, при компиляции окончательной версии ЕХЕ Я предполагаю, что вам нужно установить DEBUG = 0 или же VB автоматически обнаружит это и каким-то образом удается обеспечить отлаживать материал не компилируется (я думаю, что const должен быть внутренне жестко закодирован в компилятор, чтобы он мог это сделать, маловероятно, но просто хотел убедиться). Итак, перед выпуском просто установите DEBUG = 0 и ур готов к компиляции? –
@Erx: Нет, автоматическое обнаружение не выполняется компилятором. Символ 'DEBUG' не определяется автоматически, вы должны сделать это самостоятельно. Поэтому переход в режим «выпуска» - это ручное действие. Да, в этом примере вы изменили бы константу 'DEBUG' времени компиляции на 0. –
, что произойдет, если вы поместите DEBUG = 1 в область модуля общих деклараций кода ...? Будет ли он работать или терпеть неудачу? –