On Tue, Nov 20, 2012 at 02:54:50AM +0000, Sam Bobroff <sbobr...@shoretel.com> wrote: > Sorry if you felt that I'd disrespected your code, that wasn't my
A hack is something that happens to work, but is not well done. > > This use of assert is part of the C language that is well supported and in > > very common use for a long time now, and does what it is suppsoed to do > > very well and reliably. It's the only way to reliably achieve the effect > > libev needs. > Well... it's not an obvious, straight forward usage Very little in C is obvious and straight forward. It shouldn't be surprising that certain, even standard, idioms are not straightforward. > it seems to me that if the "normal usage" of assert was to print a > string message along with the test, assert() would take two arguments or > even a format string. Judging things by what they seem, but aren't, doesn't lead anywhere. By your logic, if "normal usage" of file systems would include directories, then C would surely have a mkdir function. But it doesn't have one. And btw., normal usage of assert is *always* to print a string message if the test fails. It's defined to do just that. If this isn't normal suage, what is? > > Putting error messages into a comment would completely defeat the purpose > > of having runtime error messages in the first place, namely telling whats > > wrong at *runtime*, when the comment is long gone. > I don't agree with you here: I think assert is for reporting "bugs in > the code" So you think assert is not for reporting runtime errors? Well, thats the only thing assert can do, because it evaluates the test at runtime only. It cannot report bugs in the code in any other way than by runtime error messages. > it always prints out the file and line number at which it occurred: this > information is mostly only useful to a programmer who has access to the > source code. A lot of asserts in libev, if they trigger, are mainly useful for me, and I don't generally have access to the sourcecode. It is much more informative to have human readable messages, and usually leads to much better feedback and understanding. Other asserts in libev indicate bugs in the caller code, and for these, human readable error messages are a must, at least by my standards. Your idea seems to be that all sourcecode is written by a single person. This is hardly the case in the real world. Human-readable error messages are a vast improvement over forcing people to read source code they might not even have access to (e.g. when libev wasn't compiled by them). > If they have access to the source and follow the assert message to where > it occurred, they would immediately see a code comment. That was what I > was suggesting. And if not, the error message is useless. Great improvement indeed. > What I do disagree with, a little, is that assert() is the right way to > generate run-time error messages. Since that is the only thing it can do (creating run-time error messages), that means you think assert is not the right way to do anything, i.e. it is a useless function. This is clearly a minority opinion that needs strong evidence. > Assert is specific, in that it crashes your code with a core dump and > prints out the file and line number: C doesn't know anything about core dumps, and assert does not generally cause a core dump. > better, user friendly, message then I think you should do so via > fprintf() or similar, and follow up with an exit() or abort() only if > appropriate. fprintf has an obvious disadvantage: it cause quote noticable code bloat for a relatively rarely used feature and it pulls in the whole of stdio, which is an enourmous cost on amyn smaller systems. The only disadvantage of assert is that you don't like it without being able to explain why. assert wins trivially. -- The choice of a Deliantra, the free code+content MORPG -----==- _GNU_ http://www.deliantra.net ----==-- _ generation ---==---(_)__ __ ____ __ Marc Lehmann --==---/ / _ \/ // /\ \/ / schm...@schmorp.de -=====/_/_//_/\_,_/ /_/\_\ _______________________________________________ libev mailing list libev@lists.schmorp.de http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev