FAQ's in C.



Section 1. Declarations and Initializations

1.1: How do you decide which integer type to use?

A: If you might need large values (tens of thousands), use long.
Otherwise, if space is very important, use short. Otherwise,
use int.

1.4: What should the 64-bit type on a machine that can support it?

A: C9X specifies long long.

1.7: What's the best way to declare and define global variables?

A: The best arrangement is to place each definition in some
relevant .c file, with an external declaration in a header file.

1.11: What does extern mean in a function declaration?

A: Nothing, really; the keyword extern is optional here.

1.12: What's the auto keyword good for?

A: Nothing.

1.14: I can't seem to define a linked list node which contains a
pointer to itself.

A: Structures in C can certainly contain pointers to themselves;
the discussion and example in section 6.5 of K&R make this
clear. Problems arise if an attempt is made to define (and use)
a typedef in the midst of such a declaration; avoid this.

1.21: How do I declare an array of N pointers to functions returning
pointers to functions returning pointers to characters?

A: char *(*(*a[N])())();
Using a chain of typedefs, or the cdecl program, makes these
declarations easier.

1.22: How can I declare a function that returns a pointer to a
function of its own type?

A: You can't quite do it directly. Use a cast, or wrap a struct
around the pointer and return that.

1.25: My compiler is complaining about an invalid redeclaration of a
function, but I only define it once.

A: Calling an undeclared function declares it implicitly as
returning int.

1.25b: What's the right declaration for main()?

A: See questions 11.12a to 11.15.

1.30: What am I allowed to assume about the initial values
of variables which are not explicitly initialized?

A: Uninitialized variables with "static" duration start out as 0,
as if the programmer had initialized them. Variables with
"automatic" duration, and dynamically-allocated memory, start
out containing garbage (with the exception of calloc).

1.31: Why can't I initialize a local array with a string?

A: Perhaps you have a pre-ANSI compiler.

1.31b: What's wrong with "char *p = malloc(10);" ?

A: Function calls are not allowed in initializers for global or
static variables.

1.32: What is the difference between char a[] = "string"; and
char *p = "string"; ?

A: The first declares an initialized and modifiable array; the
second declares a pointer initialized to a not-necessarily-
modifiable constant string.

1.34: How do I initialize a pointer to a function?

A: Use something like "extern int func(); int (*fp)() = func;" .

0 comments: