diff --git a/c.texi b/c.texi index 186d15b..b8f5850 100644 --- a/c.texi +++ b/c.texi @@ -93,7 +93,7 @@ If you understand basic concepts of programming but know nothing about C, you can read this manual sequentially from the beginning to learn the C language. -If you are a beginner to programming, we recommend you first learn a +If you are a beginner in programming, we recommend you first learn a language with automatic garbage collection and no explicit pointers, rather than starting with C@. Good choices include Lisp, Scheme, Python and Java. C's explicit pointers mean that programmers must be @@ -137,13 +137,23 @@ code will run on. Where this is the case, we say so. The C language provides no built-in facilities for performing such common operations as input/output, memory management, string -manipulation, and the like. Instead, these facilities are defined in -a standard library, which is automatically available in every C -program. @xref{Top, The GNU C Library, , libc, The GNU C Library -Reference Manual}. +manipulation, and the like. Instead, these facilities are provided by +functions defined in the standard library, which is automatically +available in every C program. @xref{Top, The GNU C Library, , libc, +The GNU C Library Reference Manual}. + +GNU/Linux systems use the GNU C Library to do this job. It is itself +a C program, so once you know C you can read its source code and see +how its library functions do their jobs. Some fraction of the +functions are implemented as @dfn{system calls}, which means they +contain a special instruction that asks the system kernel (Linux) to +do a specific task. To understand how those are implemented, you'd +need to read Linux source code instead. Whether a library function is +a system call is an internal implementation detail that makes no +difference for how to call the function. This manual incorporates the former GNU C Preprocessor Manual, which -was among the earliest GNU Manuals. It also uses some text from the +was among the earliest GNU manuals. It also uses some text from the earlier GNU C Manual that was written by Trevis Rothwell and James Youngman. @@ -490,6 +500,10 @@ uses it to explain a few features of the language. If you already know the basic points of C presented in this chapter, you can skim it or skip it. +We present examples of C source code (other than comments) using a +fixed-width typeface, since that's the way they look when you edit +them in an editor such as GNU Emacs. + @menu * Recursive Fibonacci:: Writing a simple function recursively. * Stack:: Each function call uses space in the stack. @@ -556,6 +570,12 @@ comments in the code is tremendously important---they provide background information so others can understand the code more quickly. @xref{Comments}. +In this manual, we present comment text in the variable-width typeface +used for the text of the chapters, not in the fixed-width typeface +used for the rest of the code. That is to make comments easier to +read. This distinction of typeface does not exist in a real file of C +source code. + @item Two kinds of statements, the @code{return} statement and the @code{if}@dots{}@code{else} statement. @xref{Statements}. @@ -565,8 +585,8 @@ Recursion. The function @code{fib} calls itself; that is called a @dfn{recursive call}. These are valid in C, and quite common. The @code{fib} function would not be useful if it didn't return. -Thus, recursive definitions, to be of any use, must avoid infinite -recursion. +Thus, recursive definitions, to be of any use, must avoid +@dfn{infinite recursion}. This function definition prevents infinite recursion by specially handling the case where @code{n} is two or less. Thus the maximum @@ -716,8 +736,8 @@ in the space for the value. @xref{Integer Overflow}. @cindex recursion, drawbacks of @cindex stack frame -Recursion has a drawback: there are limits to how many nested function -calls a program can make. In C, each function call allocates a block +Recursion has a drawback: there are limits to how many nested levels of +function calls a program can make. In C, each function call allocates a block of memory which it uses until the call returns. C allocates these blocks consecutively within a large area of memory known as the @dfn{stack}, so we refer to the blocks as @dfn{stack frames}. @@ -1028,7 +1048,10 @@ certain numeric @dfn{failure codes}. @xref{Values from main}. @cindex @code{printf} The simplest way to print text in C is by calling the @code{printf} -function, so here we explain what that does. +function, so here we explain very briefly what that function does. +For a full explanation of @code{printf} and the other standard I/O +functions, see @ref{I/O on Streams, The GNU C Library, , libc, The GNU +C Library Reference Manual}. @cindex standard output The first argument to @code{printf} is a @dfn{string constant} @@ -1066,10 +1089,6 @@ The first argument of @code{printf} does not have to be a string constant; it can be any string (@pxref{Strings}). However, using a constant is the most common case. -To learn more about @code{printf} and other facilities of the C -library, see @ref{Top, The GNU C Library, , libc, The GNU C Library -Reference Manual}. - @node Complete Line-by-Line @section Complete Program, Line by Line @@ -1146,6 +1165,13 @@ which starts the GDB debugger (@pxref{Sample Session, Sample Session, A Sample GDB Session, gdb, Debugging with GDB}) so you can run and debug the executable program @code{fib1}. +Richard Stallman's advice, from personal experience, is to turn to the +debugger as soon as you can reproduce the problem. Don't try to avoid +it by using other methods instead---occasionally they are shortcuts, +but usually they waste an unbounded amount of time. With the +debugger, you will surely find the bug in a reasonable time; overall, +you will get your work done faster. The sooner you get serious and +start the debugger, the sooner you are likely to find the bug. @xref{Compilation}, for an introduction to compiling more complex programs which consist of more than one source file. @@ -8016,6 +8042,7 @@ the expressions between them may be missing. A missing expression means this loop doesn't use that particular feature of the @code{for} statement. +@c ??? You can't do this if START is a declaration. Instead of using @var{start}, you can do the loop preparation before the @code{for} statement: the effect is the same. So we could have written the beginning of the previous example this way: @@ -8643,8 +8670,8 @@ This could also be written using a statement expression Ordinary labels are visible throughout the function where they are defined, and only in that function. However, explicitly declared -local labels of a block are visible in nested functions declared -within that block. @xref{Nested Functions}, for details. +local labels of a block are visible in nested function definitions +inside that block. @xref{Nested Functions}, for details. @xref{goto Statement}. @@ -11094,9 +11121,10 @@ another. @cindex thunks A @dfn{nested function} is a function defined inside another function. -The nested function's name is local to the block where it is defined. -For example, here we define a nested function named @code{square}, and -call it twice: +(The ability to do this indispensable for automatic translation of +certain programming languages into C.) The nested function's name is +local to the block where it is defined. For example, here we define a +nested function named @code{square}, then call it twice: @example @group @@ -11109,7 +11137,7 @@ foo (double a, double b) @end group @end example -The nested function can access all the variables of the containing +The nested function definition can access all the variables of the containing function that are visible at the point of its definition. This is called @dfn{lexical scoping}. For example, here we show a nested function that uses an inherited variable named @code{offset}: @@ -12958,7 +12986,7 @@ attribute. @xref{Inline Function Definitions}. @item gnu_inline The @code{gnu_inline} attribute, in a function's declaration or -definition, specifies to handle the @code{inline} keywprd the way GNU +definition, specifies to handle the @code{inline} keyword the way GNU C originally implemented it, many years before ISO C said anything about inlining. @xref{Inline Function Definitions}. @end table