![Фотография](https://vse.kz/uploads/profile/photo-thumb-40098.jpg?_r=1371449344)
high tech for humanгде научиться програмировать
#42
Отправлено 11.04.2008, 20:00:28
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
![:spy:](http://vse.kz/public/style_emoticons/default/smile.gif)
Кто хоть самую малость учил Си, тот понимает, что в этом случае надо делать так:
//приятной отладки, сволочи #define TRUE FALSE
![:smoke:](http://vse.kz/public/style_emoticons/default/smoke.gif)
#43
Отправлено 11.04.2008, 23:21:13
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
#include <stdio.h> #define FALSE false #define TRUE FALSE //отлаживайте сволочи int main() { bool f = TRUE; if(f) { printf("true"); }else { printf("false"); } return 0; };У меня откомпилилось и сработало правильно. Проблема в другом, в VS уже прописано
#define TRUE true
и
#define FALSE false
так что возможно придется писать #undef TRUE
#44
Отправлено 12.04.2008, 18:55:50
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
С того, что согласно синтаксису, TRUE должно разворачиваться вC чего это вдруг не запустится?
FALSE //отлаживайте сволочи
и тогда, по идее, вместо
bool f = TRUE;после подстановки должно было получиться
bool f = FALSE //отлаживайте сволочи;Точка с запятой получается закомментированной, это должно вызвать ошибку при компиляции, разве не так? Но, как ни странно, у меня тоже все откомпилировалось и сработало правильно!
Ну хорошо, может, здесь проблема именно в этом. А если взять что-нибудь другое, чтобы заранее не было прописано? Например:Проблема в другом, в VS уже прописано
#define TRUE true
и
#define FALSE false
так что возможно придется писать #undef TRUE
#include <stdio.h> #define swap(x,y) { int temp = x; x = y; y = temp; } int main() { int x = 5; int y = 3; printf ("До вызова swap: x = %d, y = %d\n", x, y); // Допустим, программист не посмотрел, что это макрос и вызвал swap(x,y) как будто это функция. if (x > y) swap(x,y); /* Неверно! */ printf ("После вызова swap: x = %d, y = %d\n", x, y); return 0; };Это противоположный пример - в нем должна возникнуть ошибка не из-за пропадания точки с запятой за комментарием, а наоборот, из-за появления лишней точки с запятой после макроподстановки. Но и в этом случае никакой ошибки не возникает, все работает!
P.S. Я знаю, почему это работает, но пока не скажу
![:D](http://vse.kz/public/style_emoticons/default/wink.gif)
Сообщение отредактировал Visual1: 12.04.2008, 19:24:57
#45
Отправлено 12.04.2008, 20:02:18
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
![:smoke:](http://vse.kz/public/style_emoticons/default/smile.gif)
Это противоположный пример - в нем должна возникнуть ошибка не из-за пропадания точки с запятой за комментарием, а наоборот, из-за появления лишней точки с запятой после макроподстановки. Но и в этом случае никакой ошибки не возникает, все работает!
Ну да. Лишние точки с запятой не мешают.
int main() { return 0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; }равно как и
int main() { return 0 ; ; ; ; ; ; ; ; ; ; ; ; ; }Вполне прекрасно компилится. Так и должно быть по моему. Точка с запятой обозначает конец строки текста. Причем она не обязательно должна на одной строке находится. Все правильно.
![:D](http://vse.kz/public/style_emoticons/default/smoke.gif)
А по поводу свапа - программисту который подобное написал, руки поотрывать мало. Думаю вы понимаете почему.
![:p](http://vse.kz/public/style_emoticons/default/biggrin.gif)
#46
Отправлено 12.04.2008, 22:47:40
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Да, работает, хотя по синтаксису вообще-то не должно. Мне представляется, что где-то в других системах все же не будет работать (развернется не в FALSE, а в FALSE //отлаживайте сволочи). Так что лучше избегать подобных вещей. Может, у Кернигана так прописано, как вы говорите, но у Страуструпа прописано иначе. Вот цитата из его книги:Работает потому что наверно TRUE разворачивается в FALSE а не в FALSE //отлаживайте сволочи. Это же комметарий. У кернигана все так прописано, так что это нормально, правда я не нашел у него разбора #define с комментами, видимо подразумевается само собой разумеющимся
Простой макрос определяется так:
#define name rest of line
Когда name встречается как лексема, оно заменяется на rest of line. Например:
named = name;
после расширения даст:
named = rest of line;
Да-а?! Прямо-таки во всех случаях?Ну да. Лишние точки с запятой не мешают.
![:smoke:](http://vse.kz/public/style_emoticons/default/smile.gif)
... // Допустим, программист не посмотрел, что это макрос и вызвал swap(x,y) как будто это функция. if (x > y) swap(x,y); else x = y;Ну как вам теперь? Лишние точки с запятой не мешают?
![;)](http://vse.kz/public/style_emoticons/default/biggrin.gif)
Ну-ну, не надо быть таким кровожадным.А по поводу свапа - программисту который подобное написал, руки поотрывать мало. Думаю вы понимаете почему.
![:p](http://vse.kz/public/style_emoticons/default/smile.gif)
Сообщение отредактировал Visual1: 12.04.2008, 22:51:07
#47
Отправлено 13.04.2008, 18:33:15
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Хорошо. Цитата из Страуструпа. (язык программирования С++, раздел 4.7 - тот же самый, что использовали вы, только на несколько абзацев ниже)Да, работает, хотя по синтаксису вообще-то не должно. Мне представляется, что где-то в других системах все же не будет работать (развернется не в FALSE, а в FALSE //отлаживайте сволочи). Так что лучше избегать подобных вещей. Может, у Кернигана так прописано, как вы говорите, но у Страуструпа прописано иначе. Вот цитата из его книги:
Простой макрос определяется так:
#define name rest of line
Когда name встречается как лексема, оно заменяется на rest of line. Например:
named = name;
после расширения даст:
named = rest of line;
То есть комментарии можно вставлять в строку макроса. Другое дело, что компилятор С их может не принять. А компилятор С++ запросто. Тестил на VS, C++Builder, gcc. Все работает. Возможно экзотический самописный компилятор Васи Пупкина такое и не примет, но это уже не мои проблемы.Если макроопределение достаточно сложное, и требуется комментарий
к нему, то разумнее написать комментарий вида /* */, поскольку
в реализации С++ может использоваться препроцессор С, который не
распознает комментарии вида //. Например:
#define m2(a) something(a) /* глубокомысленный комментарий */
Абсолютно. Я обычно пишуДа-а?! Прямо-таки во всех случаях?
А попробуйте совсем немного изменить мой предыдущий пример:
...
Ну как вам теперь? Лишние точки с запятой не мешают?![]()
if (x > y) { SWAP(x,y); } else { x = y; }Так кстати проще читается. ИМХО, естественно.
Опасность понимаю, поэтому и использую только когда не вижу иного выхода. А вот дальше... Я вас чем-то оскорбил?Ну-ну, не надо быть таким кровожадным.
Достаточно просто понимать опасности небрежного написания макросов (если есть возможность, лучше вообще их не использовать). С этой целью я и привел этот пример по поводу свапа. Не вы его привели, а я. Поэтому не вам у меня спрашивать, понимаю ли я, почему подобное писать нельзя. Скорее, наоборот.
#48
Отправлено 13.04.2008, 22:02:01
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
С этим я совершенно несогласен!Хорошо. Цитата из Страуструпа. (язык программирования С++, раздел 4.7 - тот же самый, что использовали вы, только на несколько абзацев ниже)
То есть комментарии можно вставлять в строку макроса.
Если макроопределение достаточно сложное, и требуется комментарий
к нему, то разумнее написать комментарий вида /* */, поскольку
в реализации С++ может использоваться препроцессор С, который не
распознает комментарии вида //. Например:
#define m2(a) something(a) /* глубокомысленный комментарий */
![:D](http://vse.kz/public/style_emoticons/default/fie.gif)
Обратите внимание на различие результатов расширения этих двух макросов:
#define m1(a) something(a) // глубокомысленный комментарий
#define m2(a) something(a) /* глубокомысленный комментарий */
например,
int a = m1(1) + 2;
int b = m2(1) + 2;
расширяется в
int a = something(1) //глубокомысленный комментарий +2;
int b = something(1) /* глубокомысленный комментарий */ +2;
Обсуждение "экзотического самописного компилятора Васи Пупкина" тоже не мои проблемы. Вообще, такого компилятора не существует, поскольку компиляторы С/С++ пишут лишь немногие, наиболее квалифицированные и опытные, разработчики. Да, у меня компилятор Microsoft тоже принял комментарий //, причем я задавал опции компиляции исходника как для С++, так и для С. Возможно, разработчики компилятора сделали любезный подарок пользователям (программистам) - зная об этой распространенной ошибке, сделали дополнительную обработку комментариев. И все же, не следует игнорировать предупреждение Б. Страуструпа - он не стал бы писать такое серьезное предупреждение (см. цитату выше) почем зря.Другое дело, что компилятор С их может не принять. А компилятор С++ запросто. Тестил на VS, C++Builder, gcc. Все работает. Возможно экзотический самописный компилятор Васи Пупкина такое и не примет, но это уже не мои проблемы.
Эти скобки вам разве только в подобных случаях помогут, а в других - нет. См. еще раз пример Б. Страуструпа насчет #define m1(a) something(a) // глубокомысленный комментарийАбсолютно. Я обычно пишу
if (x > y) { SWAP(x,y); } else { x = y; }Так кстати проще читается. ИМХО, естественно.
Ваш предыдущий вопрос (понимаю ли я пример, который мной же и был приведен) был довольно глупый. Вам на это было указано. Я думаю, для вас этого должно быть достаточно, чтобы не задавать новых глупых вопросов.А вот дальше... Я вас чем-то оскорбил?
#49
Отправлено 13.04.2008, 23:45:02
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Что то я в Страуструпе такого не нашел, ладно будем считать, что у меня Страуструп неполный. В инете нашел несколько ссылок, все совпадают с моей(по крайней мере в пункте 4.7). Ну да, ладно, возможно у вас более новое издание. Кстати второе определение может привести к еще более тяжелым последствиям. В старых средах программирования, такое встречалось. Чертовски трудноуловимая ошибка...С этим я совершенно несогласен!
Из приведенной вами цитаты Страуструпа ни в коем случае не следует того, что утверждаете вы - вы ведь утверждаете, что комментарии типа // якобы "можно вставлять в строку макроса". Полностью цитата из п. 4.7 книги Б. Страуструпа выглядит так:
Обратите внимание на различие результатов расширения этих двух макросов:
#define m1(a) something(a) // глубокомысленный комментарий
#define m2(a) something(a) /* глубокомысленный комментарий */
например,
int a = m1(1) + 2;
int b = m2(1) + 2;
расширяется в
int a = something(1) //глубокомысленный комментарий +2;
int b = something(1) /* глубокомысленный комментарий */ +2;
Возможно. Только это работает на большинстве компиляторов (на всех, которые я тестил). Не знаю как сейчас в ANSI правильно, у меня его нет, но то чем обычно пользуюсь (студия и gcc) работают прекрасно.Возможно, разработчики компилятора сделали любезный подарок пользователям (программистам) - зная об этой распространенной ошибке, сделали дополнительную обработку комментариев. И все же, не следует игнорировать предупреждение Б. Страуструпа - он не стал бы писать такое серьезное предупреждение (см. цитату выше) почем зря.
Я уже вроде говорил, что макросами пользуюсь редко. Других случаев у меня и не будет. Здесь через шаблоны надо делать.Эти скобки вам разве только в подобных случаях помогут, а в других - нет
По вашему это вопрос? O_OВаш предыдущий вопрос (понимаю ли я пример, который мной же и был приведен) был довольно глупый. Вам на это было указано. Я думаю, для вас этого должно быть достаточно, чтобы не задавать новых глупых вопросов.
Я вообще-то высказал убеждение. В конце вопроса обычно ставится вопросительный знак, если вы не знали. К тому же слово "понимаете" относилось не к тому, понимаете ли вы ваш пример, полностью согласен, это звучит глупо, а к немного другому. Читайте внимательнее. То вы слово "мультипарадигматический" мне припишите, то еще что-то не так прочитаете.Думаю вы понимаете почему.
#50
Отправлено 14.04.2008, 10:19:40
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Знаю. А что означает знакЯ вообще-то высказал убеждение. В конце вопроса обычно ставится вопросительный знак, если вы не знали.
![:-)](http://vse.kz/public/style_emoticons/default/biggrin.gif)
Неправда, это слово я вам не приписывал. Ваше слово было "мультипарадигмический". Читайте внимательнее свои же собственые сообщения.Читайте внимательнее. То вы слово "мультипарадигматический" мне припишите,
Пишите аккуратнее, и вас прочитают так, как следует.то еще что-то не так прочитаете.
#52
Отправлено 14.04.2008, 14:59:41
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
#53
Отправлено 14.04.2008, 16:10:09
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
#54
Отправлено 14.04.2008, 17:45:33
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
А что, разве наоборот? Плохо воспитанный флудер - это я, а белый и пушистый - это вы? Это я первый начал шутить насчет умственных способностей собеседника, а затем выяснять отношения?То есть я флудер, плохо воспитанный, а вы белый и пушистый?
Как же мне правильно понимать? Значит, это у вас был не вопрос, и не шутка, насчет моих способностей к пониманию моего же примера? Тогда что же это было такое, с улыбкой до ушей? (только не надо про ваше "убеждение" в том, что я способен понимать свои же собственные примеры - такое оправдание выглядит довольно нелепо).Я уже написал что вы меня неправильно поняли, особенно это заметно, когда вопрос у вас превратился в шутку.
Мира хочу, но не на таких условиях. Вы же не согласны признать, что были неправы.Ну не хотите мира, не надо.
Взаимно. Успехов.Больше на ваши посты такого рода отвечать не собираюсь. Если по теме - всегда пожалуйста.
#55
Отправлено 15.04.2008, 01:20:04
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
![:)](http://vse.kz/public/style_emoticons/default/biggrin.gif)
3 The source file is decomposed into preprocessing tokens (2.4) and sequences of white-space characters
(including comments). A source file shall not end in a partial preprocessing token or partial com-
ment14). Each comment is replaced by one space character. New-line characters are retained. Whether
each nonempty sequence of white-space characters other than new-line is retained or replaced by one
space character is implementation-defined. The process of dividing a source file’s characters into pre-
processing tokens is context-dependent. [Example: see the handling of < within a #include prepro-
cessing directive. ]
4 Preprocessing directives are executed and macro invocations are expanded. If a character sequence that
matches the syntax of a universal-character-name is produced by token concatenation (16.3.3), the
behavior is undefined. A #include preprocessing directive causes the named header or source file to
be processed from phase 1 through phase 4, recursively.
Т.е. сначала все комментарии заменяются одним пробелом, а уже потом выполняются макроподстановки.
#58
Отправлено 29.04.2008, 17:13:08
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Да, именно это подразумевалось. Это комментарийне осилила всю страницу но думаю подразумевалось //приятной отладки сволочи - это коментарий. смысле первоначально автор имел это ввиду?
![:D](http://vse.kz/public/style_emoticons/default/smile.gif)
#60
Отправлено 14.06.2008, 17:59:21
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Количество пользователей, читающих эту тему: 1
пользователей: 0, неизвестных прохожих: 1, скрытых пользователей: 0