title: Leaving out forward declarations (prototypes)
body: <p>I'm up to lesson 14 on the famous "<em>Learn C The Hard Way</em>" online course.</p>
  
  <p>In that lesson, it introduces the concept of forward declarations in <code>C</code>.
  There are two forward declarations in the code sample.  One of them can be commented out, and the code still compiles, but the other one cannot be commented out.  To me they both look equally as important.</p>
  
  <p>Here's the code.  It simply prints out all characters and their hex codes if they are from the alphabet, otherwise it skips them.</p>
  
  <p>The two compiler outputs are at the bottom of the code.
  Could someone explain why one errors out and the other one doesn't?</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;ctype.h&gt;
  
  // forward declarations
  int can_print_it(char ch);       //NOT OK to skip(??)
  void print_letters(char arg[]);  //OK to skip(??)
  
  void print_arguments(int argc, char *argv[])
  {
      int i = 0;
  
      for(i = 0; i &lt; argc; i++) {
          print_letters(argv[i]);
      }
  }
  
  void print_letters(char arg[])
  {
      int i = 0;
  
      for(i = 0; arg[i] != '\0'; i++) {
          char ch = arg[i];
  
          if(can_print_it(ch)) {
              printf("'%c' == %d ", ch, ch);
          }
      }
  
      printf("\n");
  }
  
  int can_print_it(char ch)
  {
      return isalpha(ch) || isblank(ch);
  }
  
  
  int main(int argc, char *argv[])
  {
      print_arguments(argc, argv);
      return 0;
  }
  </code></pre>
  
  <p>If I comment out the first forward declaration (first one only), this happens:</p>
  
  <pre class="lang-none prettyprint-override"><code>cc -Wall -g    ex14.c   -o ex14
  ex14.c: In function ‘print_letters’:
  ex14.c:24:9: warning: implicit declaration of function ‘can_print_it’ [-Wimplicit-function-declaration]
  ex14.c: At top level:
  ex14.c:32:5: error: conflicting types for ‘can_print_it’
  ex14.c:33:1: note: an argument type that has a default promotion can’t match an empty parameter name list declaration
  ex14.c:24:12: note: previous implicit declaration of ‘can_print_it’ was here
  make[1]: *** [ex14] Error 1
  make[1]: Leaving directory `/home/andrew/c_tutorials/lesson14/ex14_original'
  make: *** [all] Error 2
  </code></pre>
  
  <p>And if I comment out the second declaration (second one only), this happens:</p>
  
  <pre class="lang-none prettyprint-override"><code>cc -Wall -g    ex14.c   -o ex14
  ex14.c: In function ‘print_arguments’:
  ex14.c:13:9: warning: implicit declaration of function ‘print_letters’ [-Wimplicit-function-declaration]
  ex14.c: At top level:
  ex14.c:17:6: warning: conflicting types for ‘print_letters’ [enabled by default]
  ex14.c:13:9: note: previous implicit declaration of ‘print_letters’ was here
  make[1]: Leaving directory `/home/andrew/c_tutorials/lesson14/ex14_original'
  </code></pre>