# cdecl+

## C Declarations & printf/scanf ➔ Prose

Examples:

- char const * const
- int x; float y;
- int(*(*)[10])()
- typedef struct s {} s, *sptr
- int(*(*arr)[10])()
- void &(int[*]) _Atomic [0]
- fprintf(stderr, "%#*.*LF", width, precision, number)
- scanf("%4d/%2d/%2d", &year, &month, &day)

Return type may not be an array
Return type may not be a function
Can not create atomic array
Can not create atomic function
Can not create array of references
Can not create array of functions
Can not create array of void, which is an incomplete type
Can not create reference to void
Can not create reference to member
Can not declare variable/parameter of type void
Void as parameter must not have type qualifiers
Can not create pointer to reference
Arrays with type qualifiers may only appear in function parameters
VLA of unspecified size may only appear in function parameters
Functions may not be _Atomic-qualified
Functions may not be restrict-qualified
Duplicate qualifier on pointer
Duplicate qualifier on function
Zero-size arrays are a non-standard extension
Type is implicitly int
Implicit double type for complex specifier is non-standard
Parameter of array type decays to pointer
Parameter of function type decays to pointer to function
Function with empty parameter list takes unspecified number of parameters
constexpr adds an implicit const in this case
The given format string is invalid. This results in undefined behaviour.
Not enough arguments were provided for the given format string.
Too many arguments were provided for the given format string.
%% can not accept any flags, width, precision, or length modifier
%% can not have assignment suppression, width, or length modifier
%s or %[] with no width may lead to buffer overflow like gets
literals do not consume leading whitespace, which may be a pitfall here
%c and %[] do not consume leading whitespace, which may be a pitfall here
Use of max field width AND receiving buffer size in _s functions is redundant
Bounds-checked functions (_s) are optional (check #if __STDC_LIB_EXT1__ == 1)
printf outputs to stdout
fprintf outputs to the given file
sprintf outputs to the given buffer (char*)
sprintf outputs to the given buffer (char*) and size (size_t)
fprintf_s outputs to the given file
sprintf_s outputs to the given buffer (char*) and size (rsize_t)
sprintf_s outputs to the given buffer (char*) and size (rsize_t)
scanf reads from stdin
fscanf reads from the given file
sscanf reads from the given null-terminated string (const char*)
scanf_s reads from stdin
fscanf_s reads from the given file
sscanf_s reads from the given null-terminated string (const char*)
rsize_t is an alias for size_t with constraint RSIZE_MAX
For more info, see printf documentation
For more info, see scanf documentation