notebook/notes/c17/declarations.md

17 KiB

title TARGET DECK FILE TAGS tags
Declarations Obsidian::STEM c17
c17

Overview

A declaration specifies the interpretation and attributes of a set of identifiers. It indicates linkage, storage, and part of the type of the entities that the declarators denote. For example, the following declaration has two declarators x and y, both of type const int, declared in file scope with static storage duration.

extern const int x, y;

C declarations were designed so that the declaration of an object looks like the use of the object. This isn't always true, but for the most part this philosophy can be leveraged to read them.

%%ANKI Basic Consider the following translation unit. What does the declaration refer to?

extern const int x, y;

Back: The entire line. Reference: “ISO: Programming Languages - C17,” April 2017, https://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf.

END%%

%%ANKI Basic What is the type of y in the following?

extern const int x, y;

Back: const int Reference: “ISO: Programming Languages - C17,” April 2017, https://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf.

END%%

%%ANKI Basic Consider the following translation unit. What does the declaration refer to?

int* a, b;

Back: The entire line is a single declaration. Reference: “ISO: Programming Languages - C17,” April 2017, https://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf.

END%%

%%ANKI Basic What is the type of b in the following?

int* a, b;

Back: int Reference: “ISO: Programming Languages - C17,” April 2017, https://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf.

END%%

%%ANKI Basic What is the type of x in the following?

const int *const x, y;

Back: const int* const Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of y in the following?

const int *const x, y;

Back: const int Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic A declaration contains how many declarators? Back: One or more. Reference: “ISO: Programming Languages - C17,” April 2017, https://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf.

END%%

%%ANKI Basic A declarator contains how many declarations? Back: N/A. Declarations contain declarators. Reference: “ISO: Programming Languages - C17,” April 2017, https://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf.

END%%

Declarators

A declarator in C is roughly an identifier along with pointers, function brackets, or array indications.

A declarator is said to be full if is not part of another declarator. If any part of a full declarator specifies a variable length array type, the declarator is said to be variably modified. Types containing variably modified declarators are likewise called variably modified types (VMTs).

%%ANKI Basic Consider the following declaration. What are its declarators?

int* a, b;

Back: * a and b. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic Consider the following declaration. What are its declarators?

const int *const x;

Back: *const x Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic Consider the following declaration. What is its type specifier?

const int *const x;

Back: int Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic Consider the following declaration. What is its type qualifier?

const int *const x;

Back: The first const. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What does it mean for a declarator to be full? Back: It isn't part of another declarator. Reference: “ISO: Programming Languages - C17,” April 2017, https://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf.

END%%

%%ANKI Basic What does it mean for a declarator to be variably modified? Back: It contains a variable length array type. Reference: “ISO: Programming Languages - C17,” April 2017, https://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf.

END%%

%%ANKI Cloze A {full} declarator is a declarator that {isn't part of another declarator}. Reference: “ISO: Programming Languages - C17,” April 2017, https://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf.

END%%

%%ANKI Basic What is VMT an acronym form? Back: Variably modified type. Reference: “ISO: Programming Languages - C17,” April 2017, https://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf.

END%%

%%ANKI Basic What are the variably modified declarators of the parameters in the following?

void foo(int n, int M[n][n]);

Back: M[n][n] Reference: “ISO: Programming Languages - C17,” April 2017, https://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf.

END%%

%%ANKI Basic What are the variably modified declarators of the parameters in the following?

void foo(int M[static 1], int *N);

Back: M[static 1] Reference: “ISO: Programming Languages - C17,” April 2017, https://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf.

END%%

%%ANKI Basic Which parameters are variably modified in the following prototype?

void foo(int M, int[*]);

Back: The last, unnamed parameter. Reference: “ISO: Programming Languages - C17,” April 2017, https://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf.

END%%

%%ANKI Basic Which parameters are variably modified in the following prototype?

void foo(int M, int (*fp)(int N[*]));

Back: fp and N. Reference: “ISO: Programming Languages - C17,” April 2017, https://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf.

END%%

Definitions

A definition is a declaration that causes storage to be reserved for the object (for object types) or includes the function body (for function types).

%%ANKI Basic A definition contains how many declarators? Back: One or more. Reference: “ISO: Programming Languages - C17,” April 2017, https://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf.

END%%

%%ANKI Basic For object types, what distinguishes a declaration from a definition? Back: A definition causes storage to be reserved. Reference: “ISO: Programming Languages - C17,” April 2017, https://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf.

END%%

%%ANKI Basic For function types, what distinguishes a declaration from a definition? Back: A definition includes a function body. Reference: “ISO: Programming Languages - C17,” April 2017, https://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf.

END%%

%%ANKI Basic What is the relationship between a declaration and a definition? Back: All definitions are also declarations, but not the other way around. Reference: “ISO: Programming Languages - C17,” April 2017, https://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf.

END%%

Initializers

An initializer is an expression that gives an object a value at time of declaration. Only variable-length arrays (VLAs) do not allow for an initializer. The default initializer looks like {0}.

%%ANKI Basic Which part of the following are initializers?

int a = 3;

Back: 3 Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).

END%%

%%ANKI Basic Which part of the following are initializers?

double a = { 7.0 };

Back: { 7.0 } Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).

END%%

%%ANKI Basic Which part of the following are initializers?

double a = { 7.0 };

Back: { 7.0 } Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020). END%%

%%ANKI Basic How is the following updated to include initializers 1 and 2 for a and b respectively?

int a, b;

Back:

int a = 1, b = 2;

Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).

END%%

%%ANKI Basic What object types allow initializers? Back: All but VLAs. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).

END%%

%%ANKI Basic What object types do not allow initializers? Back: Just variable-length arrays. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).

END%%

%%ANKI Basic What is the default initializer? Back: {0} Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).

END%%

%%ANKI Basic {0} is a valid initializer for what object types? Back: All but VLAs. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).

END%%

%%ANKI Basic {0} is not a valid initializer for what object types? Back: Just variable-length arrays. Reference: Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).

END%%

Precedence Rules

Declarations can be read by complying with the precedence rules outlined below:

  1. Find the name of the declaration.
  2. Obey the following precedence rules:
    1. Parentheses grouping together parts of a declaration
    2. Postfix operators () and []
    3. Prefix operator: the asterisk * denoting "pointer to"
  3. If const and/or volatile keyword is next to a type specifier, it applies to the type specifier. Otherwise it applies to the pointer asterisk on its immediate left.

%%ANKI Basic In the precedence rules for C declarations, what available postfix operators are there? Back: () and []. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic In the precedence rules for C declarations, what available prefix operators are there? Back: Just *. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic In the precedence rules for C declarations, what available type qualifiers are there? Back: const and volatile. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of foo in the the following declaration?

char *const *(*foo)();

Back: A pointer to a function returning a pointer to a const pointer-to-char. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of foo in the the following declaration?

char *const *foo();

Back: A function returning a pointer to a const pointer-to-char. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of foo in the the following declaration?

int (*(*foo)(void))[3]

Back: A pointer to a function (accepting void) returning a pointer to an array (size 3) of ints. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of foo in the the following declaration?

const int (* volatile foo)[64]

Back: A volatile pointer to an array (size 64) of const ints. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of foo in the the following declaration?

const int * const foo;

Back: A const pointer to a const int. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of foo in the the following declaration?

const int * foo;

Back: A pointer to a const int. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of foo in the the following declaration?

int const * foo;

Back: A pointer to a const int. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of foo in the the following declaration?

int * const foo;

Back: A const pointer-to-int. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of foo in the the following declaration?

char *(*foo[10])(int **);

Back: An array (size 10) of pointers to functions (accepting int **) returning pointer-to-char. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

%%ANKI Basic What is the type of signal in the the following declaration?

void (*signal(int sig, void (*func)(int)))(int);

Back: A function (accepting an int and void (*)(int)) returning a pointer to a function (accepting an int) returning void. Reference: Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.

END%%

Bibliography

  • Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.
  • “ISO: Programming Languages - C17,” April 2017, https://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf.
  • Jens Gustedt, Modern C (Shelter Island, NY: Manning Publications Co, 2020).
  • Van der Linden, Peter. Expert C Programming: Deep C Secrets. Programming Languages / C. Mountain View, Cal.: SunSoft Pr, 1994.