home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / answers / C-faq / diff < prev    next >
Text File  |  1993-11-04  |  17KB  |  422 lines

  1. Newsgroups: comp.lang.c,comp.answers,news.answers
  2. Path: senator-bedfellow.mit.edu!bloom-beacon.mit.edu!world!news.kei.com!eff!news.umbc.edu!europa.eng.gtefsd.com!uunet!nwnexus!oneworld!eskimo!scs
  3. From: scs@eskimo.com (Steve Summit)
  4. Subject: comp.lang.c Changes to Answers to Frequently Asked Questions (FAQ)
  5. Message-ID: <1993Nov04.0145.scs.0006@eskimo.com>
  6. Followup-To: poster
  7. Sender: scs@eskimo.com (Steve Summit)
  8. Reply-To: scs@eskimo.com
  9. X-Archive-Name: C-faq/diff
  10. Organization: none, at the moment
  11. Date: Thu, 4 Nov 1993 09:45:59 GMT
  12. Approved: news-answers-request@MIT.Edu
  13. Lines: 406
  14. Xref: senator-bedfellow.mit.edu comp.lang.c:82573 comp.answers:2519 news.answers:14300
  15.  
  16. Archive-name: C-faq/diff
  17. Comp-lang-c-archive-name: C-FAQ-list.diff
  18.  
  19. There are two significant changes this month, both long overdue:
  20. The ANSI C Rationale is on-line (question 5.2), and an
  21. Interpretation Ruling has declared the "struct hack" illegal
  22. (question 9.6).  There is also the usual host of minor and
  23. cosmetic changes.  (As usual, I haven't quite incorporated all of
  24. the suggestions which had accumulated since the last major
  25. update; if I promised to use your suggestion and you don't see
  26. it, it's still on its way.)
  27.  
  28. Condensed context diffs follow.  (Don't try to feed these through
  29. patch(1); wait instead for the full updated list, which should be
  30. coming up next.)
  31.  
  32. ==========
  33. < [Last modified August 1, 1993 by scs.]
  34. ---
  35. > [Last modified November 3, 1993 by scs.]
  36. ==========
  37. < times.  Some vendors' compiler manuals are unfortunately inadequate; a
  38. < few even perpetuate some of the myths which this article attempts to
  39. ---
  40. > times.  Some C books and compiler manuals are unfortunately inadequate;
  41. > a few even perpetuate some of the myths which this article attempts to
  42. ==========
  43.   A:    The language definition states that for each pointer type, there
  44.     is a special value -- the "null pointer" -- which is
  45.     distinguishable from all other pointer values and which is not
  46. <     the address of any object.  That is, the address-of operator &
  47. ---
  48. >     the address of any object or function.  That is, the address-of
  49. ==========
  50. <     pointer.  For instance, the Unix system call "execl" takes a
  51. ---
  52. >     pointer.  For instance, the UNIX system call "execl" takes a
  53. ==========
  54. <     (Note that many Unix manuals get this example wrong.)
  55. ---
  56. >     (Note that many UNIX manuals get this example wrong.)
  57. ==========
  58.     5.    The ASCII null character (NUL), which does have all bits
  59. <         zero, but has no relation to the null pointer except in
  60. <         name; and...
  61. ---
  62. >         zero, but has no necessary relation to the null pointer
  63. >         except in name; and...
  64. ==========
  65.   A:    Much of the confusion surrounding pointers in C can be traced to
  66.     a misunderstanding of this statement.  Saying that arrays and
  67. <     pointers are "equivalent" does not by any means imply that they
  68. <     are interchangeable.
  69. ---
  70. >     pointers are "equivalent" neither means that they are identical
  71. >     nor interchangeable.
  72. ==========
  73.     question 2.2).  In either case, the expression x[i] (where x is
  74. <     an array or a pointer) is, by definition, exactly equivalent to
  75. <     *((x)+(i)).
  76. ---
  77. >     an array or a pointer) is, by definition, identical to *((x)+(i)).
  78. ==========
  79.   A:    Yes, Virginia, array subscripting is commutative in C.  This
  80.     curious fact follows from the pointer definition of array
  81. <     subscripting, namely that a[e] is exactly equivalent to
  82. <     *((a)+(e)), for _any_ expression e and primary expression a, as
  83. ---
  84. >     subscripting, namely that a[e] is identical to *((a)+(e)), for
  85. >     _any_ expression e and primary expression a, as long as one of
  86. ==========
  87. <         f2(aryp, m, n)
  88.         int *aryp;
  89. <         int m, n;
  90. <         { ... ary[i][j] is really aryp[i * n + j] ... }
  91. ---
  92. >         f2(aryp, nrows, ncolumns)
  93.         int *aryp;
  94. >         int nrows, ncolumns;
  95. >         { ... ary[i][j] is really aryp[i * ncolumns + j] ... }
  96. ==========
  97. >     It must be noted, however, that a program which performs
  98. >     multidimensional array subscripting "by hand" in this way is not
  99. >     in strict conformance with the ANSI C Standard; the behavior of
  100. >     accessing (&array[0][0])[x] is not defined for x > NCOLUMNS.
  101. ==========
  102. <     ; the following calls would be legal, and work as expected:
  103. ---
  104. >     ; the following calls should work as expected:
  105. ==========
  106. >     It must again be noted that passing array to f2() is not
  107. >     strictly conforming; see question 2.11.
  108. ==========
  109. <         main()
  110. <         {
  111. <             int *ip;
  112. <             f(ip);
  113. <             return 0;
  114. <         }
  115. ---
  116. >         ...
  117. >         int *ip;
  118. >         f(ip);
  119. >         ...
  120. ==========
  121. <             static int dummy;
  122.             ip = &dummy;
  123. <             *ip = 5;
  124. ---
  125. >             static int dummy = 5;
  126.             ip = &dummy;
  127. ==========
  128.     Note that this example also uses fgets instead of gets (always a
  129. <     good idea), so that the size of the array can be specified, so
  130. ---
  131. >     good idea; see question 11.5), so that the size of the array can
  132. ==========
  133. <     The Synopsis section at the top of a Unix-style man page can be
  134. ---
  135. >     The Synopsis section at the top of a UNIX-style man page can be
  136. ==========
  137.   A:    Since the two forms differ only in the value yielded, they are
  138. <     entirely equivalent when only their side effect is needed.  Some
  139. <     people will tell you that in the old days one form was preferred
  140. <     over the other because it utilized a PDP-11 autoincrement
  141. <     addressing mode, but those people are confused.
  142. ---
  143. >     entirely equivalent when only their side effect is needed.
  144. ==========
  145. <     The cost is $130.00 from ANSI or $162.50 from Global.
  146. <     Copies of the original X3.159 (including the Rationale) are
  147. <     still available at $205.00 from ANSI or $200.50 from Global.
  148. <     (Editorial comment: yes, these prices are outrageous.)
  149. <     Note that ANSI derives revenues to support its operations from
  150. <     the sale of printed standards, so electronic copies are _not_
  151. ---
  152. >     The cost is $130.00 from ANSI or $162.50 from Global.  Copies of
  153. >     the original X3.159 (including the Rationale) are still
  154. >     available at $205.00 from ANSI or $200.50 from Global.  Note
  155. >     that ANSI derives revenues to support its operations from the
  156. >     sale of printed standards, so electronic copies are _not_
  157. ==========
  158. <     The Rationale, by itself, has been printed by Silicon Press,
  159. <     ISBN 0-929306-07-4.
  160. ---
  161. >     The text of the Rationale (not the full Standard) is now
  162. >     available for anonymous ftp from ftp.uu.net (see question 17.8)
  163. >     in directory doc/standards/ansi/X3.159-1989 .  The Rationale has
  164. >     also been printed by Silicon Press, ISBN 0-929306-07-4.
  165. ==========
  166. < A:    First, are you sure you really need to convert lots of old code
  167. <     to ANSI C?  The old-style function syntax is still acceptable.
  168. ==========
  169. <     March, 1992.  (See also question 17.8.)
  170. ---
  171. >     March, 1992.  See also question 17.8.
  172. ==========
  173. >     Finally, are you sure you really need to convert lots of old
  174. >     code to ANSI C?  The old-style function syntax is still
  175. >     acceptable.
  176. ==========
  177. <     certain arguments when they are passed to functions.  Type float
  178.     is promoted to double, and characters and short integers are
  179. <     promoted to integers.  (The values are automatically converted
  180. ---
  181. >     certain arguments when they are passed to functions.  floats are
  182.      promoted to double, and characters and short integers are
  183. >     promoted to ints.  (The values are automatically converted back
  184. ==========
  185.   5.11:    Is exit(status) truly equivalent to returning status from main?
  186.  
  187. < A:    Yes, except under a few older, nonconforming systems.
  188. ---
  189. > A:    Essentially, except under a few older, nonconforming systems,
  190. >     and unless data local to main might be needed during cleanup
  191. >     (due perhaps to a setbuf or atexit call).
  192. ==========
  193.   5.16:    Is char a[3] = "abc"; legal?  What does it mean?
  194.  
  195. < A:    Yes, it is legal; it declares an array of size three,
  196.     initialized with the three characters 'a', 'b', and 'c', without
  197. <     the usual terminating '\0' character.
  198. ---
  199. > A:    It is legal, though questionably useful.  It declares an array
  200.     of size three, initialized with the three characters 'a', 'b',
  201. >     and 'c', without the usual terminating '\0' character; the array
  202. >     is therefore not a true C string and cannot be used with strcpy,
  203. >     printf %s, etc.
  204. ==========
  205.     used, but it will not work for floating-point values or
  206. <     pointers, or if the two values are the same variable, (and the
  207. ---
  208. >     pointers, or if the two values are the same variable (and the
  209. ==========
  210. < 6.8:    I have some code which contains far too many #ifdef's for my
  211. <     taste.  How can I preprocess the code to leave only one
  212. ---
  213. > 6.8:    I inherited some code which contains far too many #ifdef's for
  214. >     my taste.  How can I preprocess the code to leave only one
  215. ==========
  216. <     Unix strings(1) utility.
  217. ---
  218. >     UNIX strings(1) utility.
  219. ==========
  220.   A:    This information is not available to a portable program.  Some
  221. <     systems provide a nonstandard nargs() function, but its use is
  222. <     questionable, since it typically returns the number of words
  223. <     passed, not the number of arguments.  (Floating point values and
  224. ---
  225. >     old systems provided a nonstandard nargs() function, but its use
  226. >     was always questionable, since it typically returned the number
  227. >     of words passed, not the number of arguments.  (Floating point
  228. ==========
  229. <     The preprocessor macros TRUE and FALSE (and, of course, NULL)
  230.     are used for code readability, not because the underlying values
  231. <     might ever change.  (See also question 1.7.)
  232. ---
  233. >     The preprocessor macros TRUE and FALSE are used for code
  234.     readability, not because the underlying values might ever
  235. >     change.  (See also questions 1.7 and 1.9.)
  236. ==========
  237. A:    This technique is popular, although Dennis Ritchie has called it
  238. <     "unwarranted chumminess with the compiler."  The ANSI C standard
  239. <     allows it only implicitly.  It seems to be portable to all known
  240.     implementations.  (Compilers which check array bounds carefully
  241. ---
  242. >     "unwarranted chumminess with the compiler."  An ANSI
  243. >     Interpretation Ruling has deemed it not strictly conforming.  It
  244. >     seems, however, to be portable to all known implementations.
  245. ==========
  246.     A similar problem, with a similar solution, can arise when
  247. <     attempting to declare a pair of typedef'ed mutually recursive
  248. ---
  249. >     attempting to declare a pair of typedef'ed mutually referential
  250.     structures.
  251. ==========
  252. < 10.4:    How do I declare an array of pointers to functions returning
  253. ---
  254. > 10.4:    How do I declare an array of N pointers to functions returning
  255. ==========
  256. < A:    This question can be answered in at least three ways (all
  257. <     declare the hypothetical array with 5 elements):
  258. ---
  259. > A:    This question can be answered in at least three ways:
  260. ==========
  261. <     1.  char *(*(*a[5])())();
  262. ---
  263. >     1.  char *(*(*a[N])())();
  264. ==========
  265. <         pfpfpc a[5];        /* array of... */
  266. ---
  267. >         pfpfpc a[N];        /* array of... */
  268. ==========
  269. <         cdecl> declare a as array 5 of pointer to function returning
  270.              pointer to function returning pointer to char
  271. <         char *(*(*a[5])())()
  272. ---
  273. >         cdecl> declare a as array of pointer to function returning
  274.              pointer to function returning pointer to char
  275. >         char *(*(*a[])())()
  276. ==========
  277. <     that Unix compilers and linkers typically use a "common model"
  278. ---
  279. >     that UNIX compilers and linkers typically use a "common model"
  280. ==========
  281.   11.4:    Why won't the code
  282.  
  283. <         while(!feof(fp))
  284. <             fgets(buf, MAXLINE, fp);
  285. ---
  286. >         while(!feof(infp)) {
  287. >             fgets(buf, MAXLINE, infp);
  288. >             fputs(buf, outfp);
  289. >         }
  290.  
  291.     work?
  292. ==========
  293.     Usually, you should just check the return value of the input
  294. <     routine (fgets in this case); feof() is rarely needed.
  295. ---
  296. >     routine (fgets in this case); often, you don't need to use
  297. >     feof() at all.
  298. ==========
  299. <     to use fgets() to read a whole line, and then use sscanf or
  300. ---
  301. >     to use fgets to read a whole line, and then use sscanf or other
  302. ==========
  303. < A:    This problem is, in general, insoluble.  Under Unix, for
  304. ---
  305. > A:    This problem is, in general, insoluble.  Under UNIX, for
  306. ==========
  307. <             time_t now;
  308. <             time(&now);
  309. ---
  310. >             time_t now = time((time_t *)NULL);
  311.             printf("It's %.24s.\n", ctime(&now));
  312. ==========
  313. < A:    Unix and some other systems provide a popen() routine, which
  314. ---
  315. > A:    UNIX and some other systems provide a popen() routine, which
  316. ==========
  317. <     are available on most Unix systems.  Implementations also exist
  318. ---
  319. >     are available on most UNIX systems.  Implementations also exist
  320. ==========
  321. <     separately (bundled with other C tools) from Unix Support Labs
  322. ---
  323. >     separately (bundled with other C tools) from UNIX Support Labs
  324. ==========
  325. <     instance, under Unix, you usually need to use the -lm option,
  326. ---
  327. >     instance, under UNIX, you usually need to use the -lm option,
  328. ==========
  329.   15.3:    Why doesn't C have an exponentiation operator?
  330.  
  331. < A:    You can #include <math.h> and use the pow() function, although
  332. ---
  333. > A:    Because few processors have an exponentiation instruction.
  334. >     Instead, you can #include <math.h> and use the pow() function,
  335. ==========
  336. <     name/value functionality similar to the Unix environment in
  337. ---
  338. >     name/value functionality similar to the UNIX environment in
  339. ==========
  340. <     Under Unix, a process can modify its own environment (some
  341. ---
  342. >     Under UNIX, a process can modify its own environment (some
  343. ==========
  344. <     determine this number in advance.  Under Unix, the stat call
  345. ---
  346. >     determine this number in advance.  Under UNIX, the stat call
  347. ==========
  348. <     a Unix-like stat which will give an approximate answer.  You can
  349. ---
  350. >     a UNIX-like stat which will give an approximate answer.  You can
  351. ==========
  352. <     nonportable (it gives you an accurate answer only under Unix,
  353. ---
  354. >     nonportable (it gives you an accurate answer only under UNIX,
  355. ==========
  356. < A:    Unfortunately, there is no portable way.  V7 Unix, and derived
  357. ---
  358. > A:    Unfortunately, there is no portable way.  V7 UNIX, and derived
  359. ==========
  360.     System V and Posix.  Other routines you might look for on your
  361. <     system include clock() and gettimeofday().  The select() and
  362. ---
  363. >     system include nap(), setitimer(), msleep(), usleep(), clock(),
  364. >     and gettimeofday().  The select() and poll() calls (if
  365. ==========
  366. <     BSD Unix, you could use system() and ld -A to do the linking for
  367. ---
  368. >     BSD UNIX, you could use system() and ld -A to do the linking for
  369. ==========
  370.     static), are guaranteed initialized to zero, as if the
  371.     programmer had typed "= 0".  Therefore, such variables are
  372. <     initialized to the null pointer (of the correct type) if they
  373. ---
  374. >     initialized to the null pointer (of the correct type; see also
  375. >     Section 1) if they are pointers, and to 0.0 if they are
  376.     floating-point.
  377. ==========
  378.     Then, just search the table for the name, and call through the
  379. <     associated function pointer.
  380. ---
  381. >     associated function pointer.  See also questions 9.8 and 16.10.
  382. ==========
  383. <     which can be sped up by using buffering and cacheing techniques.
  384. ---
  385. >     which can be sped up by using buffering and caching techniques.
  386. ==========
  387. <     which perform dynamic stack allocation automatically (e.g. Unix)
  388. ---
  389. >     which perform dynamic stack allocation automatically (e.g. UNIX)
  390. ==========
  391. < A:    Mitch Wright maintains an annotated bibliography of C and Unix
  392. ---
  393. > A:    Mitch Wright maintains an annotated bibliography of C and UNIX
  394. ==========
  395.   Thanks to Jamshid Afshar, Sudheer Apte, Randall Atkinson, Dan Bernstein,
  396.   Vincent Broman, Stan Brown, Joe Buehler, Gordon Burditt, Burkhard Burow,
  397.   D'Arcy J.M. Cain, Christopher Calabrese, Paul Carter, Raymond Chen,
  398. > Jonathan Coxhead, James Davies, Jutta Degener, Norm Diamond, Ray Dunn,
  399.   Stephen M. Dunn, Bjorn Engsig, Alexander Forst, Jeff Francis, Dave
  400.   Gillespie, Samuel Goldstein, Alasdair Grant, Ron Guilmette, Doug Gwyn,
  401.   Tony Hansen, Joe Harrington, Guy Harris, Jos Horsmeier, Blair Houghton,
  402. > Kirk Johnson, Peter Klausler, Andrew Koenig, Tom Koenig, Ajoy
  403. > Krishnan T, John Lauro, Felix Lee, Don Libes, Christopher Lott, Tim
  404. > McDaniel, John R. MacMillan, Bob Makowski, Evan Manning, Barry Margolin,
  405.   Brad Mears, Mark Moraes, Darren Morby, Landon Curt Noll, David O'Brien,
  406.   Richard A. O'Keefe, Hans Olsson, Francois Pinard, Pat Rankin, Erkki
  407.   Ruohtula, Rich Salz, Chip Salzenberg, Paul Sand, Doug Schmidt, Patricia
  408.   Shanahan, Peter da Silva, Joshua Simons, Henry Spencer, David Spuler,
  409.   Erik Talvola, Clarke Thatcher, Wayne Throop, Chris Torek, Goran
  410. > Uddeborg, Rodrigo Vanegas, Wietse Venema, Ed Vielmetti, Larry Virden,
  411.   Chris Volpe, Freek Wiedijk, Dave Wolverton, Mitch Wright, Conway Yee,
  412.   and Zhuo Zang, who have contributed, directly or indirectly, to this
  413.   article.  Special thanks to Karl Heuer, and particularly to Mark Brader,
  414.   who (to borrow a line from Steve Johnson) have goaded me beyond my
  415.   inclination, and occasionally beyond my endurance, in relentless pursuit
  416.   of a better FAQ list.
  417. ==========
  418.  
  419.                     Steve Summit
  420.                     scs@eskimo.com
  421.