Comments 33
UPD:
Ну вот, мой остроумный коммент оказался мало того что не уникальным, так еще и не первым…
#define DEBUG
#ifdef DEBUG
…
#else
…
#endif
#ifdef DEBUG
…
#else
…
#endif
?
Тем, что комментарий надо искать и руками править, а DEBUG и любые другие дефайны можно конфигурировать на этапе конфигурирования/сборки, а также о них и их состоянии чаще всего знает ваша IDE. Это очевидно же.
"… каких-то 8 лет назад..."
Мой подход не идеален, но ваш ужасен.
Переделывайте лучше на #ifdef. Пока не поздно.
Нет уж, лучше по-старинке:
#ifdef DEBUG
#endif
Печаталось это на барабанном принтере, который интерпретировал CRLF как «очистить буфер»/«продвинуть бумагу на строку».
Студенческая работа на алголе. пишем строку кода, потом слово comment, потом пробел и комментарий, очень похожий на код, но неправильный. Строка заканчивается нормальным crlf, ессно. Получив колоду перфокарт, отыскиваем нужный столбец и перевырезаем лезвием пробел на символ CR.
Итого: на печати начальная часть строки и слово comment не появляются, так как буфер принтера очищен (cr). Зато неправильный код вот он, на печати, как родной.
Сдаём в работу, получаем распечатку, несём преподавательнице.
— Незачёт.
— Почему?
— У вас в программе грубые ошибки.
— Не может быть, вот, ниже ведь результат. Он правильный?
— Да, правильный. Но так быть не может.
— Но вот же распечатка. Транслятор ошибок не выдал, программа выполнилась без ошибок и выдала правильные результаты — почему незачёт?
— …
было, развлекались пару раз…
_________________
Связь с постом — вроде бы понятная?
Лезвием дырки в перфокарте сверлить — мда, работа для ювелира-труженика :) Эх, времена… Я в немножко похожей ситуации пользовался автоматическим переносом слишком длинной строки. Принтеры были уже матричные.
И как можно пробел (20) перерезать в CR (0D)?
Зависит от кодировки перфокарт, а она была разная.
В некоторых случаях пробел кодировался как раз отсутствием пробивок.
В КПК-12 (иногда неправильно назывался ДКОИ-12, а 12 потому, что каждый символ кодировался пробивками или их остутствием в 12 строках) вроде оно невозможно (если не путаю), поскольку код пробела имел отверстие, которого не должно было быть в CR
Лезвием дырки в перфокарте сверлить — мда, работа для ювелира-труженика
Это да. У нас специальный пробойник имелся.
ну, положим, не 20, а 40
Я там в hex выражался, а не в oct. Вспомнил позже, что да, пробелы были вообще без пробивок. А вот какими были коды CR ил LF не помню совсем.
Я там в hex выражался, а не в octуфф. Какой такой hex в М-222? Восьмерично-десятичные символы. И вообще, речь про перфокарты — со своим кодом. Кстати, точно уже не помню, в каких позициях что было. Больше 40 лет прошло, всё-таки. А подделывать гугленьем не хочу.
Тут вам не ANSI. Так что именно 0х40 (ДКОИ-8).
А пробел в разных перфокартных кодировках разным был.
В КПК-12 пробел вроде был 12-9-8-5, а CR — 8-4 (могу путать, давно прошли времена, когда перфокарты по дырочкам мог читать).
#define mode 0
#if mode == 0
#elif mode == 1
#elif mode == 2
...
#elif mode == 999999999
#endif
case DebugMode of
0: Begin
//// код 1
End;
1: Begin
//// Код 2
End;
2: Begin
//// Код 3
End;
PS: Простите за паскаль
Но если в стартовом комментарии между второй звездочкой и слешем вставить пробел
может между звездочками? иначе тогда не понимаю как это работает.
Нет, пробел между звездочками ничего не изменит, именно перед слешем. Это превращает */ в * / и дезавуирует последовательность как завершающий комментарий токен. Таковым становится следующий в очереди /*/, который до этого наоборот начинал следующий блок комментария, и т.д. по цепочке до завершающего /**/. Лучше всего это наблюдать в IDE с подсветкой синтаксиса.
/**/
Console.Write("1");
/*/
Console.Write("2");
/*/
Console.Write("3");
/*/
Console.Write("4");
/**/
Console.Write("5");
выведет 135, но после вставки пробела между звездочкой и слэшэм уже будет 245:
/** /
Console.Write("1");
/*/
Console.Write("2");
/*/
Console.Write("3");
/*/
Console.Write("4");
/**/
Console.Write("5");
P.S. <source lang="cpp"> помог)
Спасибо за разъяснение.
Браво! Выходит автор выстрелил себе в ногу даже в статье в которой рассказывал как это сделать:)
Выходит автор выстрелил себе в ногу даже в статье в которой рассказывал как это сделать:)
:)))) Мда, выходит. Но заодно рикошетом зацепил целую кучу завсегдатаев гиков, которые из-за этого осерчали, и оказались не гиками, а нёрдами, и понаставили кучу минусов за несоответствие их идеалам. Вместо того, чтобы просто похихикать :)
Дело то не в идеалах.
Реально ж очень легко запутаться где там пробел. Потому и заминусили статью.
Но тогда у Вас перепутано.
Так точно. Этот самый попутал, который с рожками. Спасибо за поправку. Внесу Вашу коррекцию в текст.
Однако такая конструкция не позволяет создавать более двух альтернативных участков кода.
Директивами препроцессора (#ifdef, #if defined() и т.д.) можно создавать сколько угодно альтернативных участков кода. У меня, например, поддерживается около 18 вариантов одной программы. Причем во многих IDE можно создавать отдельные конфигурации построения под каждый вариант и построить все или выбранные варианты в несколько кликов мыши :)
Выключка кода комментарием: маленький лайфхак