<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Vincent Gable's Blog &#187; C++</title>
	<atom:link href="http://vgable.com/blog/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://vgable.com/blog</link>
	<description>my weblog.</description>
	<lastBuildDate>Tue, 29 Nov 2011 22:20:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>The Most Useful Objective-C Code I&#8217;ve Ever Written</title>
		<link>http://vgable.com/blog/2010/08/19/the-most-useful-objective-c-code-ive-ever-written/</link>
		<comments>http://vgable.com/blog/2010/08/19/the-most-useful-objective-c-code-ive-ever-written/#comments</comments>
		<pubDate>Thu, 19 Aug 2010 10:01:01 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[Announcement]]></category>
		<category><![CDATA[Bug Bite]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Research]]></category>
		<category><![CDATA[Sample Code]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[LOG_EXPR]]></category>
		<category><![CDATA[macros]]></category>
		<category><![CDATA[NSLog]]></category>
		<category><![CDATA[Preprocessor]]></category>
		<category><![CDATA[printf]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/?p=670</guid>
		<description><![CDATA[Actually, it&#8217;s the most useful code I&#8217;ve extended; credit for the core idea goes to Dave Dribin with his Handy NSString Conversion Macro. LOG_EXPR(x) is a macro that prints out x, no matter what type x is, without having to worry about format-strings (and related crashes from eg. printing a C-string the same way as [...]]]></description>
			<content:encoded><![CDATA[<p>Actually, it&#8217;s the most useful code I&#8217;ve <em>extended</em>; credit for the core idea goes to <a href="http://www.dribin.org/dave/">Dave Dribin</a> with his <a href="http://www.dribin.org/dave/blog/archives/2008/09/22/convert_to_nsstring/"><cite>Handy NSString Conversion Macro</cite></a>.</p>
<p><strong><code><a href="">LOG_EXPR</a>(x)</code> is a macro that prints out <code>x</code>, no matter what type <code>x</code> is</strong>, without having to worry about format-strings (and related crashes from eg. printing a C-string the same way as an <code>NSString</code>). It works on Mac OS X and iOS. Here are some examples,</p>
<p><code>LOG_EXPR(self.window.screen);</code></p>
<blockquote><p>self.window.screen = &lt;UIScreen: 0x6d20780; bounds = {{0, 0}, {320, 480}}; mode = &lt;UIScreenMode: 0x6d20c50; size = 320.000000 x 480.000000&gt;&gt;
</p></blockquote>
<p><code>LOG_EXPR(self.tabBarController.viewControllers);</code></p>
<blockquote><p>self.tabBarController.viewControllers = (<br />
    &#8220;&lt;UINavigationController: 0xcd02e00&gt;&#8221;,<br />
    &#8220;&lt;SavingsViewController: 0xcd05c40&gt;&#8221;,<br />
    &#8220;&lt;SettingsViewController: 0xcd05e90&gt;&#8221;<br />
)</p></blockquote>
<p>Pretty straightforward, really. The biggest convenience so far is having the expression printed out, so you don&#8217;t have to write out a name redundantly in the format string (eg. <code> NSLog(@"actionURL = %@", actionURL)</code>). But <code>LOG_EXPR</code> really shows it&#8217;s worth when you start using scalar or <code>struct</code> expressions:</p>
<p><code>LOG_EXPR(self.window.windowLevel);</code></p>
<blockquote><p>self.window.windowLevel = 0.000000</p></blockquote>
<p><code>LOG_EXPR(self.window.frame.size);</code></p>
<blockquote><p>self.window.frame.size = {320, 480}</p></blockquote>
<p>Yes, there are expressions that won&#8217;t work, but they&#8217;re pretty rare for me. I use <code>LOG_EXPR</code> every day. Several times. It&#8217;s not quite as good as having <a href="http://vgable.com/blog/2010/06/14/ask-f-script/">a REPL for Cocoa</a>, but it&#8217;s handy.</p>
<p><a href="#Get_LOG_EXPR">Give it a try</a>.</p>
<h3>How It Works</h3>
<p>The problem is how to pick a function or format string to print <code>x</code>, based on the type of <code>x</code>. C++&#8217;s type-based dispatch would be a good fit here, but it&#8217;s verbose (a full function-definition per type) and I wanted to use pure Objective-C if possible. Fortunately, <strong>Objective-C has an <a href="http://developer.apple.com/mac/library/documentation/cocoa/conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html"><code>@encode()</code></a>  compiler directive that returns a string describing any type it&#8217;s given.</strong> Unfortunately it works on <em>types</em>, not variables, but with C99 <strong>the <code><a href="http://gcc.gnu.org/onlinedocs/gcc/Typeof.html">typeof()</a></code> compiler directive lets us get the type of any variable</strong>, which we can pass to <code>@encode()</code>.  The final bit of compiler magic is using <a href="http://gcc.gnu.org/onlinedocs/cpp/Stringification.html">stringification (<code>#</code>)</a> to print out the literal string inside <code>LOG_EXPR()</code>&#8216;s parenthesis.</p>
<h3>The Macro, Line By Line</h3>
<div class="code-box">
<pre>
1 #define LOG_EXPR(_X_) do{\
2 	__typeof__(_X_) _Y_ = (_X_);\
3 	const char * _TYPE_CODE_ = @encode(__typeof__(_X_));\
4 	NSString *_STR_ = VTPG_DDToStringFromTypeAndValue(_TYPE_CODE_, &#038;_Y_);\
5 	if(_STR_)\
6 		NSLog(@"%s = %@", #_X_, _STR_);\
7 	else\
8 		NSLog(@"Unknown _TYPE_CODE_: %s for expression %s in function %s, file %s, line %d", _TYPE_CODE_, #_X_, __func__, __FILE__, __LINE__);\
9 }while(0)
</pre>
</div>
<ol>
<li>The first and last lines are a way to put <code>{}</code>&#8216;s around the macro to prevent <a href="http://en.wikipedia.org/wiki/C_preprocessor#Multiple_statements">unintended effects</a>. The <code>do{}while(0);</code> &#8220;loop&#8221; does nothing else.</li>
<li>First evaluate the expression, <code>_X_</code>, given to <code>LOG_EXPR</code> <em>once</em>, and store the result in a <code>_Y_</code>. We need to use <code><a href="http://gcc.gnu.org/onlinedocs/gcc/Typeof.html">typeof()</a></code> (which had to be written <code>__typeof__()</code> to appease some versions of GCC) to figure out the type of <code>_Y_</code>.</li>
<li><code>_TYPE_CODE_</code> is c-string that <a href="http://developer.apple.com/mac/library/documentation/cocoa/conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html">describes the type</a> of the expression we want to print out.</li>
<li>Now we have enough information to call a function, <code>VTPG_DDToStringFromTypeAndValue()</code> to convert the expression&#8217;s value to a string. We pass it the <code>_TYPE_CODE_</code> string, and <em>the address of </em> <code>_Y_</code>, which is a pointer, and has a known size. We can&#8217;t pass <code>_Y_</code> directly, because depending on what <code>_X_</code> is, it will have different types and could be of any size.</li>
<li><code>VTPG_DDToStringFromTypeAndValue()</code> returns <code>nil</code> if it can&#8217;t figure out how to convert a value to a string.</li>
<li>Everything went well, print the <a href="http://gcc.gnu.org/onlinedocs/cpp/Stringification.html">stringified</a> expression, <code>#_X_</code>, and  the string representing it&#8217;s value, <code>_STR_</code>.</li>
<li>otherwise…</li>
<li>The expression had a type we can&#8217;t handle, print out a verbose diagnostic message.</li>
<li>See line 1.</li>
</ol>
<h3>The <code>VTPG_DDToStringFromTypeAndValue()</code> Function</h3>
<p>See the source in <a href="http://github.com/VTPG/CommonCode/blob/master/VTPG_Common.m">VTPG_Common.m</a>:</p>
<p><iframe src ="http://github.com/VTPG/CommonCode/blob/master/VTPG_Common.m" width="100%" height="300">(Your browser does not support iframes.)</iframe></p>
<p>It&#8217;s derived from  <a href="http://www.dribin.org/dave/">Dave Dribin</a>&#8216;s function <a href="http://www.dribin.org/dave/blog/archives/2008/09/22/convert_to_nsstring/"> <code>DDToStringFromTypeAndValue()</code></a>, and is pretty straightforward: <code>strcmp()</code> the type-string, and if it matches a known type call a function, or use <code>+[NSString stringWithFormat]:</code>, to turn the value into a string.</p>
<h3>The First Step Twords Fixing Your Macro Problem is Admitting it&#8230;</h3>
<p>So yeah, maybe I went a little wild with macros here…</p>
<p>But it took out some <a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself">WET</a>-ness of the original code, and prevents me from accidentally mixing up types in a long wall of <code>if</code>s, eg.</p>
<div class="code-box">
<pre>
else if (strcmp(typeCode, @encode(NSRect)) == 0)
{
    return NSStringFromRect(*(NSRange *)value);
}
else if (strcmp(typeCode, @encode(NSRange)) == 0)
{
    return NSStringFromRect(*(NSRange *)value);
}
</pre>
</div>
<p>If I were cool, I&#8217;d use <code>NSDictionary</code>s to map from the <code>@encode</code>-string to an appropriate format string or function pointer.  This is conceptually cleaner; less error-prone than using macros; and almost certainly faster. Unfortunately, it gets a little tricky with functions, since I need to deference <code>value</code> into the proper type.</p>
<p>One final note from my testing, I could do away with the <code>strcmp()</code>s, because directly comparing <code>@encode</code> string pointers (eg <code>if(typeCode == @encode(NSString*))</code> works. I don&#8217;t know if it will <em>always</em> work though, so relying on it strikes me as a profoundly Bad Idea. But maybe that bad idea will give someone a good idea.</p>
<h3>Limitations</h3>
<h4>Arrays</h4>
<p>C arrays generally muck things up. Casting to a pointer works around this:</p>
<div class="code-box">
<pre>
char x[14] = "Hello, world!";
//LOG_EXPR(x); //error: invalid initializer
LOG_EXPR((char*)x); //prints fine
</pre>
</div>
<h4><code>__func__</code></h4>
<p>Because it is a <code>static const char []</code>, <code><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1642.html">__func__</a></code> (and <code>__FUNCTION__</code> or <code>__PRETTY_FUNCTION__</code>) need casting to <code>char*</code> to work with <code>LOG_EXPR</code>. Because logging out a function/method call is something I do frequently, I use the macro:</p>
<div class="code-box">
<pre>
#define LOG_FUNCTION()	NSLog(@"%s", __func__)</pre>
</div>
<h4><code>long double</code> (Leopard and older)</h4>
<p>On older systems, <code>LOG_EXPR</code> won&#8217;t work with a <code>long double</code> value, because <code>@encode(long double)</code> gives the same result as <code>@encode(double)</code>. This is a <a href="http://openradar.appspot.com/6468314">known issue</a> with the runtime. The top-level <code>LOG_EXPR</code> macro could detect a <code>long double</code> with <code>if((sizeof(_X_) == sizeof(long double)) &#038;&#038; (_TYPE_CODE_ == @encode(double)))</code>. But I doubt this will ever be necessary.</p>
<p>I haven&#8217;t actually written any code that uses <code>long double</code>, because I <strong>use <code><a href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html#//apple_ref/doc/uid/20000055-BCIHCEFJ">NSDecimal</a></code>, or another base-10 number format, for situations that require more precision than a <code>double</code>.</strong></p>
<h3>Scaling and Frameworks </h3>
<p>Growing <code>LOG_EXPR</code> to handle <em>every</em> type is a lot of work. I&#8217;ve only added types that I&#8217;ve actually needed to print. This has kept the code manageable, and seems to be working so far.</p>
<p>The biggest problem I have is <strong>how to deal with types that are in frameworks that not every project includes</strong>. Projects that use CoreLocation.framework need to be able to use <code>LOG_EXPR</code> to print out CoreLocation specific <code>struct</code>s, like <code> CLLocationCoordinate2D</code>. But projects that <em>don&#8217;t</em> use CoreLocation.framework don&#8217;t have a definition of the <code>CLLocationCoordinate2D</code> type, so code to convert it to a string won&#8217;t compile. There are two ways I&#8217;ve tried to solve the problem</p>
<h4>Comment-out framework-specific code</h4>
<p>This is pretty self-explanatory, I&#8217;ll fork VTPG_Common.m and un-comment-out code for types that my project needs to print. It works, but it&#8217;s drudgery. Programmers hate that.</p>
<h4>Hardcode type info</h4>
<p>The idea is to hard-code the string that <code>@encode(SomeType)</code> would evaluate to, and then (since we know how <code>SomeType</code> is laid out in memory) use casting and pointer-arithmetic to get at the fields.</p>
<p>For example:</p>
<div class="code-box">
<pre>
//This is a hack to print out CLLocationCoordinate2D, without needing to #import &lt;CoreLocation/CoreLocation.h&gt;
//A CLLocationCoordinate2D is a struct made up of 2 doubles.
//We detect it by hard-coding the result of @encode(CLLocationCoordinate2D).
//We get at the fields by treating it like an array of doubles, which it is identical to in memory.
if(strcmp(typeCode, "{?=dd}")==0)//@encode(CLLocationCoordinate2D)
	return [NSString stringWithFormat:@"{latitude=%g,longitude=%g}",((double*)value)[0],((double*)value)[1]];
</pre>
</div>
<p>This Just Works in a project that includes CoreLocation, and doesn&#8217;t mess up projects that don&#8217;t. Unfortunately it&#8217;s <em>horribly brittle</em>. Any Xcode or system update could break it. It&#8217;s not a tenable fix.</p>
<h3>Areas for Improvement</h3>
<p>If there&#8217;s some type <code>LOG_EXPR</code> can&#8217;t handle that you need, please <a href="http://github.com/VTPG/CommonCode">jump right in and improve it</a>!</p>
<p>When I have time, I plan to write a general parser for <code>@encode()</code>-strings. This will let me print out <em>any</em> <code>struct</code>, which mostly solves the type-defined-in-missing-framework problem, and would let <code>LOG_EXPR</code> Just Work with types from all kinds of POSIX/C libraries.</p>
<h3><a name="Get_LOG_EXPR"></a>Using <code>LOG_EXPR()</code> in Your Project </h3>
<p>Download <a href="http://github.com/VTPG/CommonCode/blob/master/VTPG_Common.m">VTPG_Common.m</a> and <a href="http://github.com/VTPG/CommonCode/blob/master/VTPG_Common.h">VTPG_Common.h</a> from <a href="http://github.com/VTPG/CommonCode">my github repository</a>, and add them to your Xcode project.</p>
<p>Now just add the line <code>#import "VTPG_Common.h"</code> to your prefix file (named <code>&lt;ProjectName&gt;_Prefix.pch</code> by default), after the <code>#ifdef __OBJC__</code>, for example:</p>
<div class="code-box">
<pre>
#ifdef __OBJC__
    #import &lt;Foundation/Foundation.h&gt;
    // maybe other files, depending on project  template...
    #import "VTPG_Common.h"
#endif</pre>
</div>
<p>Now <code>LOG_EXPR()</code> will work everywhere in your project.</p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2010/08/19/the-most-useful-objective-c-code-ive-ever-written/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>#define String</title>
		<link>http://vgable.com/blog/2010/07/19/define-string/</link>
		<comments>http://vgable.com/blog/2010/07/19/define-string/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 04:56:19 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[Bug Bite]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Constants]]></category>
		<category><![CDATA[macros]]></category>
		<category><![CDATA[NSString]]></category>
		<category><![CDATA[Programming Style]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/?p=658</guid>
		<description><![CDATA[When I need a string-constant, I #define it, instead of doing the &#8220;right&#8221; thing and using an extern const NSString * variable. UPDATE 2010-07-20 Thanks to Elfred Pagen for pointing out that you should always put () around your macros. Wrong: #define A_STRING @"hello" instead use (), even when you don&#8217;t think you have to: [...]]]></description>
			<content:encoded><![CDATA[<p>When I need a string-constant, I <code>#define</code> it, instead of doing the &#8220;right&#8221; thing and using an <code>extern const NSString *</code> variable.</p>
<p><H3>UPDATE 2010-07-20</H3> Thanks to <a href="http://twitter.com/elfredpagan">Elfred Pagen</a> for pointing out that you should <strong>always put () around your macros</strong>. Wrong: <del><code>#define A_STRING @"hello"</code></del></p>
<p>instead use (), even when you don&#8217;t think you have to:</p>
<p><code>#define A_STRING (@"hello")</code></p>
<p>This prevents <strong>accidental string concatenation</strong>. In C, string-literals separated only by whitespace are implicitly concatenated. It&#8217;s the same with Objective-C string literals.  This feature lets you break long strings up into several lines, so <code>NSString *x = @"A long string!"</code> can be rewritten:</p>
<div class="code-box">
<pre>
NSString *x =
	@"A long"
	@" string!";
</pre>
</div>
<p>Unfortunately, this seldom-used feature can backfire in unexpected ways. Consider making an array of two strings:</p>
<div class="code-box">
<pre>
#define X @"ex"
#define P @"plain"
a = [NSArray arrayWithObjects:X
                              P,
                              nil];
</pre>
</div>
<p>That <em>looks</em> right, but I forgot a &#8220;<code>,</code>&#8221; after <code>X</code>, so after string-concatenation, <code>a</code> is <code>['explain']</code>, not <code>['ex','plain']</code>.</p>
<p>Moral of the story: <strong>you can never have too many ()&#8217;s in macros</strong>.</p>
<p>And, now, back to why I use <code>#define</code>&#8230;</p>
<h3>It&#8217;s less code</h3>
<p>Using an <code>extern</code> variable means declaring it in a header, <em>and</em> defining it in some implementation file. But a macro is just one line in a header.</p>
<h3>It&#8217;s faster to lookup</h3>
<p>Because there&#8217;s only the definition of a macro, Open Quickly/command-double-clicking a macro <em>always</em> jumps to the definition, so you can see what it&#8217;s value is in one step. Generally Xcode jumps to a symbol&#8217;s declaration first, and <em>then</em> it&#8217;s definition, making it slower to lookup the value of a <code>const</code> symbol.</p>
<h3>It&#8217;s still type safe</h3>
<p>An <code>@"NSString literal"</code> has type information, so mistakes like,</p>
<pre>#define X (@"immutable string")
NSMutableString *y = X;
[y appendString:@"z"];
</pre>
<p>still generate warnings.</p>
<h3>It lets the compiler <a href="http://bobthegnome.blogspot.com/2009/07/format-not-string-literal-and-no-format.html">check format-strings</a></h3>
<p>Xcode can catch errors like &#8220;<code>[NSString stringWithFormat:@"reading garbage since there's no argument: %s"]</code>&#8220;, <a href="http://vgable.com/blog/2009/12/09/compile-safer/">if you let it</a>. Unfortunately, the Objective-C compiler isn&#8217;t smart enough to check <code>[NSString stringWithFormat:externConstString,x,y,z];</code> because it doesn&#8217;t know what an <code>extern</code> variable contains until link-time. But preprocessor macros are evaluated early enough in the build process that that the compiler can check their values.</p>
<h3>It can&#8217;t be changed at runtime</h3>
<p>It&#8217;s possible to change the value of <code>const</code> variables through pointers, like so:</p>
<div class="code-box">
<pre>
const NSString* const s = @"initial";
NSString **hack = &#038;s;
*hack = @"changed!";
NSLog(s);//prints "changed!"
</pre>
</div>
<p>Yes this is pathological code, but I&#8217;ve seen it happen (I&#8217;m looking at you <code>AddressBook.framework</code>!)</p>
<p>Of course, you can re-<code>#define</code> a preprocessor-symbol, so macros aren&#8217;t a panacea for pathological constant-changing code. (Nothing is!) But they push the pathology into compile time, and common wisdom is that it&#8217;s easier to debug compile-time problems, so that&#8217;s a Good Thing. You may <a href="http://vgable.com/blog/2008/09/18/i-would-rather-have-a-runtime-error-than-a-compile-error/">disagree there</a>, and you may be right! All I can say for sure is that <em>in my experience</em>, I&#8217;ve had bugs from <code>const</code> values changing at runtime, but no bugs from re-<code>#define</code>-ed constants (yet).</p>
<h3>Conclusion</h3>
<p>Preprocessor macros are damnably dangerous in C. Generally you should avoid them. But for <code>NSString*</code> constants in applications, I think they&#8217;re easier, and arguably less error prone. So go ahead and <code>#define YOUR_STRING_CONSTANTS (@"like this")</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2010/07/19/define-string/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Never Name a Variable &#8220;Index&#8221;</title>
		<link>http://vgable.com/blog/2010/05/24/never-name-a-variable-index/</link>
		<comments>http://vgable.com/blog/2010/05/24/never-name-a-variable-index/#comments</comments>
		<pubDate>Mon, 24 May 2010 05:31:42 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[Bug Bite]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Names]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/?p=603</guid>
		<description><![CDATA[Never name a variable index, especially in C. Instead say what it indexes. For example, if it is used to index an array of Foo objects, call it fooArrayIndex, or currentFooIndex. If the index variable is just used to enumerate over a collection of objects, (eg. for(int i = 0; i &#038;lt arraySize; i++){…} ) [...]]]></description>
			<content:encoded><![CDATA[<p><strong><em>Never</em> name a variable <code>index</code></strong>, especially in C.</p>
<p>Instead <strong>say <em>what</em> it indexes</strong>. For example, if it is used to index an array of <code>Foo</code> objects, call it <code>fooArrayIndex</code>, or <code>currentFooIndex</code>.</p>
<p>If the index variable is just used to enumerate over a collection of objects, (eg. <code>for(int i = 0; i &#038;lt arraySize; i++){…} </code>) then <a href="http://vgable.com/blog/2008/04/07/foreach-for-the-win/">iterate smarter</a>, using a simpler construct that doesn&#8217;t require declaring auxiliary variables. (Eg., in Objective-C use <a href="http://developer.apple.com/mac/library/documentation/cocoa/conceptual/objectivec/articles/ocfastenumeration.html">Fast Enumeration</a>). It&#8217;s not always possible to do this, but it&#8217;s always a good idea to try.<sup>1</sup></p>
<h3>Why <code>index</code> is Especially Bad in C</h3>
<p>The standard <code>strings.h</code> header declares a function named <code>index</code>, that finds the first occurrence of a charicter in a C-string. In practical terms <strong>every C program will have the <code>index</code> function declared everywhere</strong>.</p>
<p>But when a variable is declared with the name <code>index</code> it <a href="http://leepoint.net/notes-java/data/variables/60shadow-variables.html">shadows</a> the function &#8211; meaning the local variable named <code>index</code> takes over the name <code>index</code>, so the function can&#8217;t be called anymore:</p>
<pre>
char * world = index("Hello, World", 'W');
NSLog(@"'%s'", world);
</pre>
<p>Prints &#8220;&#8216;World&#8217;&#8221;, but</p>
<pre>
int index = 0;
char * world = index("Hello, World", 'W');
NSLog(@"'%s'", world);
</pre>
<p>Won&#8217;t compile, because an <code>int</code> isn&#8217;t a function.</p>
<p>Obviously this is a problem for code that uses the <code>index()</code> function — but honestly modern code probably uses a safer, <a href="http://www.mikeash.com/pyblog/friday-qa-2010-02-19-character-encodings.html">unicode-aware</a> string parsing function instead. What&#8217;s given me the most trouble is that <strong>shadowing <code>index</code> makes the compiler give lots of bogus warnings, if you have the useful <code>GCC_WARN_SHADOW</code> <a href="http://vgable.com/blog/2009/12/09/compile-safer/">warning turned on</a></strong>.</p>
<p>There are other good reasons as, specific to Objective-C, which <a href="http://boredzo.org/blog/archives/2009-11-05/the-peril-of-the-index-function">Peter Hosey covers</a>.</p>
<p><sup>1</sup><small>If you <em>really</em> can&#8217;t think of a better name than &#8220;index&#8221;, I prefer the more terse <code>i</code>. It sucks, but at least it&#8217;s shorter. Brevity is a virtue.</small></p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2010/05/24/never-name-a-variable-index/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A C &amp;Puzzler[]</title>
		<link>http://vgable.com/blog/2009/12/25/a-c-puzzler/</link>
		<comments>http://vgable.com/blog/2009/12/25/a-c-puzzler/#comments</comments>
		<pubDate>Fri, 25 Dec 2009 20:35:54 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[Announcement]]></category>
		<category><![CDATA[Bug Bite]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Arrays]]></category>
		<category><![CDATA[GCC]]></category>
		<category><![CDATA[Pointers]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/?p=547</guid>
		<description><![CDATA[Here&#8217;s a C-puzzler for you! given this function, void foo(char* s){ printf("s is at: %p\n s is: '%s'\n", s, s); } and that char s[] = "Joy!"; foo(s); prints out s is at: 0xbffff46b s is: &#8216;Joy!&#8217; what will this next line print? foo(&#038;s); //WHAT WILL THIS DO? Pick all that apply: Print &#8220;Joy!&#8221; Print [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a C-puzzler for you!</p>
<p>given this function,</p>
<pre>void foo(char* s){
	printf("s is at: %p\n s is: '%s'\n", s, s);
}</pre>
<p>and that</p>
<pre>
char s[] = "Joy!";
foo(s);
</pre>
<p>prints out</p>
<blockquote><p>
s is at: <code>0xbffff46b</code><br />
s is: &#8216;Joy!&#8217;
</p></blockquote>
<p>what will this next line print?</p>
<pre><strong>foo(&#038;s); //WHAT WILL THIS DO?</strong>
</pre>
<p>Pick all that apply:</p>
<ol>
<li>Print &#8220;Joy!&#8221;</li>
<li>Print garbage</li>
<li>Print the same address for <code>s</code></li>
<li>Print the a different address for <code>s</code></li>
<li>Crash</li>
<li>Go into an Infinite loop</li>
</ol>
<h3>Answer</h3>
<p><small>Answer: one and three</small></p>
<p>Yeah, it&#8217;s not what I expected either, especially since:</p>
<pre>@encode(__typeof__(s)) = [5c]
@encode(__typeof__(&#038;s)) = ^[5c]</pre>
<p>In fact, all of these are equvalent (modulo type warnings):</p>
<pre>
foo(s);
foo(&#038;s[0]);
foo(&#038;(*s));
foo(&#038;s);
</pre>
<p><a href="http://www.reddit.com/r/programming/comments/i6k5/jeez_after_all_these_years_a_c_array_vs_pointer">Explanation</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2009/12/25/a-c-puzzler/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>JavaScript Nailed &#124;&#124;</title>
		<link>http://vgable.com/blog/2009/10/20/javascript-nailed/</link>
		<comments>http://vgable.com/blog/2009/10/20/javascript-nailed/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 19:59:30 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Look At My Stupid Factorial Function]]></category>
		<category><![CDATA[Programming Language Design]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/?p=468</guid>
		<description><![CDATA[One thing about JavaScript I really like is that its &#124;&#124;, the Logical Or operator, is really a more general &#8216;Eval Until True&#8216; operation. (If you have a better name for this operation, please leave a comment!) It&#8217;s the same kind of or operator used in Lisp. And I believe it&#8217;s the best choice for [...]]]></description>
			<content:encoded><![CDATA[<p>One thing about JavaScript I really like is that its <code>||</code>, the <code>Logical Or</code> operator, is really a more general &#8216;<code>Eval Until True</code>&#8216; operation. (<strong>If you have a better name for this operation, please leave a comment!)</strong> It&#8217;s the same kind of <code>or</code> operator <a href="http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node75.html">used in Lisp</a>. And I believe it&#8217;s the best choice for a language to use.</p>
<p>In C/C++, <code>a || b</code> is equivalent to,</p>
<pre>
  if a evaluates to a non-zero value:
    return true;
  if b evaluates to a non-zero value:
    return true;
  otherwise:
    return false;
</pre>
<p>Note that if <code>a</code> can be converted to <code>true</code>, then <code>b</code> is <em>not</em> evaluated. Importantly, <strong>in C/C++ <code>||</code> always returns a <code>bool</code></strong>.</p>
<p>But <strong>the JavaScript <code>||</code> returns the <em>value</em> of the first variable that can be converted to <code>true</code></strong>, or the last variable if both variables can&#8217;t be interpreted as <code>true</code>,</p>
<pre>
  if a evaluates to a non-zero value:
    return a;
  otherwise:
    return b;
</pre>
<h3>Concise</h3>
<p>JavaScript&#8217;s <code>||</code> is some sweet syntactic sugar.</p>
<p>We can write,</p>
<pre>return playerName || "Player 1";</pre>
<p>instead of,</p>
<pre>return playerName ? playerName : "Player 1";</pre>
<p>And simplify <code>assert</code>-like code in a perl-esq way,</p>
<pre>x || throw "x was unexpectedly null!";</pre>
<p>It&#8217;s interesting that a more concise definition of <code>||</code> allows more concise code, even though intuitively we&#8217;d expect a more complex <code>||</code> to &#8220;do more work for us&#8221;.</p>
<h3>General</h3>
<p>Defining <code>||</code> to return values, not <code>true</code>/<code>false</code>, is much more useful for functional programming.</p>
<p>The short-circuit-evaluation is powerful enough to replace <code>if</code>-statements. For example, the familiar factorial function,</p>
<pre>function factorial(n){
	if(n == 0) return 1;
	return n*factorial(n-1);
}</pre>
<p>can be written in JavaScript using <code>&#038;&#038;</code> and <code>||</code> expressions,</p>
<pre>function factorial2(n){ return n * (n &#038;&#038; factorial2(n-1)) || 1;}</pre>
<p>Yes, I know this isn&#8217;t the clearest way to write a factorial, and it would still be an expression if it used <code>?:</code>, but hopefully this gives you a sense of what short-circuiting operations can do.</p>
<p>Unlike <code>?:</code>, the two-argument <code>||</code> intuitively generalizes to <em>n</em> arguments, equivalent to <code>a1 || a2 || ... || a<em>n</em></code>. This makes it even more useful for dealing with abstractions.</p>
<p>Logical operators that return values, instead of simply booleans, are more expressive and powerful, although at first they may not seem useful &#8212; especially coming from a language without them.</p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2009/10/20/javascript-nailed/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>sizeof() Style</title>
		<link>http://vgable.com/blog/2009/10/19/sizeof-style/</link>
		<comments>http://vgable.com/blog/2009/10/19/sizeof-style/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 17:23:26 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[Bug Bite]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Programming Style]]></category>
		<category><![CDATA[sizeof]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/?p=460</guid>
		<description><![CDATA[Never say sizeof(sometype) when you can say sizeof(a_variable). The latter works even if the type of a_variable changes, and it is much more obvious what the size is supposed to represent.]]></description>
			<content:encoded><![CDATA[<p>Never say <code>sizeof(sometype)</code> when you can say <code>sizeof(a_variable)</code>.  The latter works even if the type of <code>a_variable</code> changes, and it is much more obvious what the size is supposed to represent.</p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2009/10/19/sizeof-style/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack: Counting Variadic Arguments in C</title>
		<link>http://vgable.com/blog/2009/10/16/hack-counting-varadic-arguments-in-c/</link>
		<comments>http://vgable.com/blog/2009/10/16/hack-counting-varadic-arguments-in-c/#comments</comments>
		<pubDate>Fri, 16 Oct 2009 05:04:09 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Research]]></category>
		<category><![CDATA[Sample Code]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Introspection]]></category>
		<category><![CDATA[Parsing]]></category>
		<category><![CDATA[Programming Language Design]]></category>
		<category><![CDATA[Variadic Functions]]></category>
		<category><![CDATA[Variadic Macros]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/?p=442</guid>
		<description><![CDATA[This isn&#8217;t practical, but I think it&#8217;s neat that it&#8217;s doable in C99. The implementation I present here is incomplete and for illustrative purposes only. Background C&#8217;s implementation of variadic functions (functions that take a variable-number of arguments) is characteristically bare-bones. Even though the compiler knows the number, and type, of all arguments passed to [...]]]></description>
			<content:encoded><![CDATA[<p>This isn&#8217;t practical, but I think it&#8217;s neat that it&#8217;s doable in C99. The implementation I present here is <strong>incomplete and for illustrative purposes only</strong>.</p>
<h3>Background</h3>
<p>C&#8217;s implementation of <a href="http://cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html">variadic functions</a> (functions that take a variable-number of arguments) is characteristically bare-bones. Even though the compiler knows the number, and type, of all arguments  passed to variadic functions; there isn&#8217;t a mechanism for the function to get this information from the compiler. Instead, programmers need to pass an extra argument, like the <code>printf</code> <a href="http://en.wikipedia.org/wiki/Printf#printf_format_placeholders">format-string</a>, to tell the function &#8220;these are the arguments I gave you&#8221;. This has worked for over 37 years. But it&#8217;s clunky &#8212; you have to write the same information twice, once for the compiler and again to tell the function what you told the compiler.</p>
<h3>Inspecting Arguments in C</h3>
<h4>Argument Type</h4>
<p><strong>I don&#8217;t know of a way to find the type of the Nth argument to a varadic function, called with heterogeneous types.</strong> If you can figure out a way, I&#8217;d love to know. <strong>The <a href="http://gcc.gnu.org/onlinedocs/gcc/Typeof.html"><code>typeof</code></a> extension is often sufficient to write generic code that works when every argument has the same type.</strong> (<a href="http://www.cplusplus.com/doc/tutorial/templates/">C++ templates</a> also solve this problem if we step outside of C-proper.)</p>
<h4>Argument Count (The Good Stuff Starts Here)</h4>
<p><strong>By using <a href="http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html">variadic macros</a>, and <a href="http://gcc.gnu.org/onlinedocs/cpp/Stringification.html">stringification (<code>#</code>)</a>, we can actually pass a function the literal string of its argument list from the source code &#8212; which it can parse to determine how many arguments it was given.<br />
</strong></p>
<p>For example, say <code>f()</code> is a variadic function. We create a variadic wrapper macro, <code>F()</code> and call it like so in our source code,</p>
<pre>x = F(a,b,c);</pre>
<p>The preprocessor expands this to,</p>
<pre>x = f("a,b,c",a,b,c)</pre>
<p>Or perhaps,</p>
<pre>x = f(count_arguments("a,b,c"),a,b,c)</pre>
<p>where <code>count_arguments(char *s)</code> returns the number of arguments in the string source-code string <code>s</code>. (Technically <code>s</code> would be an argument-expression-list).</p>
<h3>Example Code</h3>
<p>Here&#8217;s an implementation for, <code>iArray()</code>, an array-builder for <code>int</code> values, very much like <a href="http://www.amazon.com/gp/product/0596101996?ie=UTF8&#038;tag=vincgabl-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0596101996">JavaScript</a>&#8216;s <code>Array()</code> constructor. Unlike the <a href="http://www.youtube.com/watch?v=hQVTIJBZook">quirky JavaScript</a> <code>Array()</code>, <code>iArray(3)</code> returns an array containing just the element 3, <code>[3]</code>, not an uninitilized array with 3 elements, <code>[undefined, undefined, undefined]</code>. Another difference: <code>iArray()</code>, invoked with no arguments, is invalid, and will not compile.</p>
<pre>
#define iArray(...) alloc_ints(count_arguments(#__VA_ARGS__), __VA_ARGS__)
</pre>
<p>This macro is pretty straightforward. It&#8217;s given a variable number of arguments, represented by <code>__VA_ARGS__</code> in the expansion. <code>#__VA_ARGS__</code> <a href="http://gcc.gnu.org/onlinedocs/cpp/Stringification.html">turns the code into a string</a> so that <code>count_arguments</code> can analyze it. (If you were doing this for real, you should use two levels of <a href="http://gcc.gnu.org/onlinedocs/cpp/Stringification.html">stringification</a> though, otherwise macros won&#8217;t be fully expanded. I choose to keep things &#8220;demo-simple&#8221; here.)</p>
<pre>
unsigned count_arguments(char *s){
	unsigned i,argc = 1;
		for(i = 0; s[i]; i++)
			if(s[i] == ',')
				argc++;
	return argc;
}
</pre>
<p>This is a <strong>dangerously naive</strong> implementation and only works correctly when <code>iArray()</code> is given a straightforward non-empty list of values or variables. Basically it&#8217;s the least code I could write to make a working demo.</p>
<p>Since <code>iArray</code> must have at least one argument to compile, we just count the commas in the argument-list to see how many other arguments were passed. Simple to code, but it fails for more complex expressions like <code>f(a,g(b,c))</code>.</p>
<pre>
int *alloc_ints(unsigned count, ...){
	unsigned i = 0;
	int *ints = malloc(sizeof(int) * count);
	va_list args;
    va_start(args, count);
	for(i = 0; i < count; i++)
		ints[i] = va_arg(args,int);
	va_end(args);
	return ints;
}
</pre>
<p>Just as you'd expect, this code allocates enough memory to hold <code>count</code> <code>int</code>s, and fills it with the remaining <code>count</code> arguments. Bad things happen if &lt; <code>count</code> arguments are passed, or they are the wrong type.</p>
<p><a href="http://vgable.com/code/iArray.c">Download the code</a>, if you like.</p>
<h3><a href="http://steve-yegge.blogspot.com/2007/06/rich-programmer-food.html">Parsing is Hard</a>, Let's Go Shopping</h3>
<p>I didn't even try to correctly parse <em>any</em> valid argument-expression-list in <code>count_arguments</code>. It's non trivial. I'd rather deal with choosing the correct <code>MAX3</code> or <code>MAX4</code> macro in a few places than maintain such a code base.</p>
<p>So this kind of introspection isn't really practical in C. But it's neat that it can be done, without any tinkering with the compiler or language.</p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2009/10/16/hack-counting-varadic-arguments-in-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Don&#8217;t Check malloc()</title>
		<link>http://vgable.com/blog/2009/10/12/dont-check-malloc/</link>
		<comments>http://vgable.com/blog/2009/10/12/dont-check-malloc/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 01:25:21 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Quotes]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[malloc]]></category>
		<category><![CDATA[Mike Ash]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/?p=434</guid>
		<description><![CDATA[There&#8217;s no point in trying to recover from a malloc failure on OS X, because by the time you detect the failure and try to recover, your process is likely to already be doomed. There&#8217;s no need to do your own logging, because malloc itself does a good job of that. And finally there&#8217;s no [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>There&#8217;s no point in trying to recover from a <code>malloc</code> failure on OS X, because by the time you detect the failure and try to recover, your process is likely to already be doomed. There&#8217;s no need to do your own logging, because <code>malloc</code> itself does a good job of that. And finally there&#8217;s no real need to even explicitly abort, because any <code>malloc</code> failure is virtually guaranteed to result in an instantaneous crash with a good stack trace.</p></blockquote>
<p>&#8211;<a href="http://www.mikeash.com/?page=pyblog/friday-qa-2009-10-09-defensive-programming.html">Mike Ash</a></p>
<p>This is <em>excellent advice</em>. Peppering your code with <code>if</code> statements harms readability and simplicity.</p>
<p>It&#8217;s still a good idea to check large (many MB) <code>malloc</code>s, but I can&#8217;t imagine recovering gracefully from a situation where 32 byte memory allocations are failing on a modern desktop.</p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2009/10/12/dont-check-malloc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Emergent Libraries</title>
		<link>http://vgable.com/blog/2009/05/14/emergent-libraries/</link>
		<comments>http://vgable.com/blog/2009/05/14/emergent-libraries/#comments</comments>
		<pubDate>Thu, 14 May 2009 14:46:01 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Research]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[LLVM]]></category>
		<category><![CDATA[Programming Language Design]]></category>
		<category><![CDATA[Programming Style]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Static Analysis]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/2009/05/14/emergent-libraries/</guid>
		<description><![CDATA[I have latched onto an idea, but don&#8217;t have the resources to follow up on it: could a static-analysis tool identify repeated patterns of code, across many code bases, that should be extracted out as subroutines and higher-level functions? How universal would these &#8220;emergent libraries&#8221; be? My inspiration here is Section 4.1 Identifying Common Functions, [...]]]></description>
			<content:encoded><![CDATA[<p>I have latched onto an idea, but don&#8217;t have the resources to follow up on it: could <a href="http://llvm.org/">a static-analysis tool</a> identify repeated patterns of code, across <a href="http://github.com/">many</a> <a href="http://code.google.com/">code</a> <a href="http://sourceforge.net/">bases</a>, that should be extracted out as subroutines and higher-level functions? How universal would these &#8220;emergent libraries&#8221; be?</p>
<p>My inspiration here is <cite>Section 4.1 Identifying Common Functions</cite>, in the <strong>excellent paper</strong> <a href="http://cr.yp.to/qmail/qmailsec-20071101.pdf"><cite>Some Thoughts on Security After Ten Years of qmail 1.0</cite> (PDF)</a>, by Daniel J. Bernstein,</p>
<blockquote><p> Most programmers would never bother to create such a small  function. But several words of code are saved whenever one  occurrence of the <code>dup2()</code>/<code>close()</code> pattern is replaced with  one call to <code>fd_move();</code> replacing a dozen occurrences saves  considerably more code than were spent writing the function  itself. (The function is also <strong>a natural target for tests</strong>.)  The same benefit scales to larger systems and to a huge variety of functions; <code>fd_move()</code> is just one example. In many cases an automated scan for common operation sequences  can suggest <strong>helpful new functions</strong>, but even without automation I frequently find myself thinking “Haven’t I seen this  before?” and extracting a new function out of existing code.</p></blockquote>
<p>What&#8217;s particularly fascinating to me are <strong>the <em>new</em> operations we might find</strong>.</p>
<p>Before I was exposed to the <a href="http://www.haskell.org/onlinereport/standard-prelude.html">Haskell prelude</a> I hadn&#8217;t known about the fundamentally useful <a href="http://en.wikipedia.org/wiki/Foldl"><code>foldl</code> and <code>foldr</code></a> operations.  I had written dozens of programs that used accumulation, but it&#8217;s generalization hadn&#8217;t occurred to me &#8212; and probably never would have. Static analysis can help uncover generalizations that we might have missed, or didn&#8217;t think were important, but turn out <em>in practice</em> to be widely used operations.</p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2009/05/14/emergent-libraries/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Beware rangeOf NSString Operations</title>
		<link>http://vgable.com/blog/2009/04/19/beware-rangeof-nsstring-operations/</link>
		<comments>http://vgable.com/blog/2009/04/19/beware-rangeof-nsstring-operations/#comments</comments>
		<pubDate>Sun, 19 Apr 2009 15:42:05 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[Bug Bite]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Sample Code]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[NSRange]]></category>
		<category><![CDATA[NSString]]></category>
		<category><![CDATA[Objective-C 2.0]]></category>
		<category><![CDATA[x86]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/2009/04/19/beware-rangeof-nsstring-operations/</guid>
		<description><![CDATA[I have repeatedly had trouble with the rageOf&#8230; NSString methods, because they return a struct. Going forward I will do more to avoid them, here are some ways I plan to do it. Sending a message that returns a struct to nil can &#8220;return&#8221; undefined values. With small structs like NSRange, you are more likely [...]]]></description>
			<content:encoded><![CDATA[<p>I have repeatedly had trouble with the <a href="http://developer.apple.com/DOCUMENTATION/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html#//apple_ref/occ/instm/NSString/rangeOfCharacterFromSet:"><code>rageOf</code>&#8230; <code>NSString</code> methods</a>, because they return a <code>struct</code>. Going forward I will do more to avoid them, here are some ways I plan to do it.</p>
<p><a href="http://vgable.com/blog/2008/05/31/messages-to-nowhere/">Sending a message that returns a <code>struct</code> to <code>nil</code> can &#8220;return&#8221; <em>undefined</em> values</a>. With small <code>struct</code>s like <code>NSRange</code>, you are more likely to get <code>{0}</code> on Intel, compared to PowerPC and iPhone/ARM. Unfortunately, this makes <code>nil</code>-messaging bugs hard to detect.  In my experience <strong>you will miss them when running on the simulator, even if they are 100% reproducible on an actual iPhone</strong>.</p>
<p>This category method has helped me avoid using <code>-rangeOfString:</code> dangerously,</p>
<pre>
@implementation NSString  (HasSubstring)
- (BOOL) hasSubstring:(NSString*)substring;
{
	if(<a href="http://vgable.com/blog/2008/12/16/isempty/">IsEmpty</a>(substring))
		return NO;
	NSRange substringRange = [self rangeOfString:substring];
	return substringRange.location != NSNotFound &#038;&#038; substringRange.length &gt; 0;
}
@end
</pre>
<p>I choose to define <code>[aString hasSubstring:@""]</code> as <code>NO</code>. You might prefer to throw an exception, or differentiate between <code>@""</code> and <code>nil</code>. But I don&#8217;t think a <code>nil</code> string is enough error to throw an exception. And even though technically any string contains the empty string, I generally treat <code>@""</code> as semantically equivalent to <code>nil</code>.</p>
<p>As <a href="http://vgable.com/blog/2008/05/31/messages-to-nowhere/">I&#8217;ve said before</a>,</p>
<blockquote><p>A few simple guidelines can help you avoid my misfortune:</p>
<ul>
<li> Be especially careful using of any objective-C method that returns a <code>double, struct,</code> or <code>long long</code>
<li> Don&#8217;t write methods that return a <code>double</code>, <code>struct</code>, or<code>long long</code>.  Return an object instead of a <code>struct</code>; an <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html"><code>NSNumber*</code></a> or <code>float</code> instead of a <code>double</code> or <code>long long</code>.  If you must return a dangerous data type, then see if you can avoid it. There really isn&#8217;t a good reason to return a <code>struct</code>, except for efficiency. And when micro-optimizations like that matter, it makes more sense to write that procedure in straight-C, which avoids the overhead of Objective-C message-passing, and solves the undefined-return-value problem.
<li> But if you absolutely must return a dangerous data type, then return it in a parameter. That way you can give it a default value of your choice, and won&#8217;t have undefined values if an object is unexpectedly <code>nil</code>.<br />
Bad:<br />
<code>- (struct CStructure) evaluateThings;</code><br />
Good:<br />
<code>- (void) resultOfEvaluatingThings:(struct CStructure*)result;</code>.
</ul>
</blockquote>
<p>It&#8217;s not a bad idea to wrap up all the <code>rangeOf</code> methods in functions or categories that play safer with <code>nil</code>.</p>
<p><small>Thanks to <a href="http://www.sealiesoftware.com/">Greg Parker</a> for corrections!</small></p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2009/04/19/beware-rangeof-nsstring-operations/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

