fluent_c_-_principles_practices_and_patterns_topics

Fluent C - Principles, Practices, and Patterns Topics

Patterns on Error Handling

Pattern Name and Summary

Function Split

Function Split”:

The function has several responsibilities and that makes the function hard to read and hard to maintain. Therefore, split it up. Take a part of a function that seems useful on its own, create a new function with that, and call that function.

Guard Clause

Guard Clause”:

The function is hard to read and hard to maintain because it mixes pre-condition checks with the main functionality of the function. Therefore, check whether you have mandatory pre-conditions and immediately return from the function if these pre-conditions are not met.

Samurai Principle

Samurai Principle

When returning error information, you assume that the caller checks for this information. However, the caller can simply omit this check and the error might go unnoticed. Therefore, return from a function victorious or not at all. If there is a situation for which you know that an error cannot be handled, then abort the program.

Goto Error Handling

Goto Error Handling

Code gets difficult to read and to maintain if it acquires and cleans up multiple resources at different places within a function. Therefore, have all resource cleanup and error handling at the end of the function. If a resource cannot be acquired, use the goto statement to jump to the resource cleanup code.

Cleanup Record

Cleanup Record

It is difficult to make a piece of code easy to read and to maintain if this code acquires and cleans up multiple resources, in particular if those resources depend on one another. Therefore, call resource acquisition functions as long as they succeed and store which functions require cleanup. Call the cleanup functions depending on these stored values.

Object-Based Error Handling

Patterns on Returning Error Information

Return Error Codes

Return Error Codes

You want to have a mechanism to transport error information to the caller, so that the caller can react to it. You want the mechanism to be simple to use, and the caller should be able to clearly distinguish between different error situations that could occur. Therefore, use the Return Value of a function to transport error information. Return a value that represents a specific kind of error. You as the callee and the caller must have a mutual understanding of what the value means.

Return Relevant Errors

Return Relevant Errors

On the one hand, the caller should be able to react to errors; on the other hand the more error information you return, the more your code and the code of your caller has to deal with error handling, which makes the code longer. Longer code is harder to read and maintain and brings in the risk of additional bugs. Therefore, only transport error information to the caller if that information is relevant to the caller. Error information is only relevant to the caller if the caller can react to that information.

Special Return Values

Special Return Values

You want to transport error information, but it’s not an option to explicitly Return Error Codes, because that implies that you cannot use the Return Value of the function to return other data, and you’d have to transport that data via Out-Parameters, which would make calling your function more difficult. Therefore, use the Return Value of your function to transport the data computed by the function. Reserve one or more special values to be returned if an error occurs.

Log Errors

Log Errors

You want to make sure that in case of an error you can easily find out its cause. However, you don’t want your error handling code to become complicated because of that. Therefore, use different channels to transport error information that is relevant for the calling code and error information that is relevant for the developer. For example, write debug error information into a log file and don’t return the detailed debug error information to the caller.

Patterns on Memory Management

Stack First

Stack First

Deciding the storage-class and memory section (stack, heap, …) for variables is a decision every programmer has to make often. It gets exhausting if for each and every variable, the pros and cons of all possible alternatives have to be considered in detail. Therefore, simply put your variables by default on the stack to profit from automatic cleanup of stack variables.

Eternal Memory

Eternal Memory

Holding large amounts of data and transporting it between function calls is difficult, because you have to make sure that the memory for the data is large enough and that the lifetime extends across your function calls. Therefore, put your data into memory that is available throughout the whole lifetime of your program.

Screw Freeing

Screw Freeing

Having dynamic memory is required if you need large amounts of memory and memory where you don’t know the required size beforehand. However, handling cleanup of dynamic memory is a hassle and is the source of many programming errors. Therefore, allocate dynamic memory and let the operating system cope with deallocation by the end of your program.

Dedicated Ownership

Dedicated Ownership

The great power of using dynamic memory comes with the great responsibility of having to properly clean that memory up. In larger programs, it becomes difficult to make sure that all dynamic memory is cleaned up properly. Therefore, right at the time when you implement memory allocation, clearly define and document where it’s going to be cleaned up and who is going to do that.

Allocation Wrapper

Allocation Wrapper

Each allocation of dynamic memory might fail, so you should check allocations in your code to react accordingly. That is cumbersome because you have many places for such checks in your code. Therefore, wrap the allocation and deallocation calls and implement error handling or additional memory management organization in these wrapper functions.

Pointer Check

Pointer Check

Programming errors that lead to accessing an invalid pointer cause uncontrolled program behavior, and such errors are difficult to debug. However, because your code works a lot with pointers, there is a good chance that you introduced such programming errors. Therefore, explicitly invalidate uninitialized or freed pointers and always check pointers for validity before accessing them.

Memory Pool

Memory Pool

Frequently allocating and deallocating objects from the heap leads to memory fragmentation. Therefore, hold a large piece of memory throughout the whole lifetime of your program. At runtime, retrieve fixed-size chunks of that memory pool instead of directly allocating new memory from the heap.

Patterns on Returning Data from C Functions

Return Value

Return Value

The function parts you want to split are not independent from one another. As usual in procedural programming, some part delivers a result that is then needed by some other part. The function parts that you want to split need to share some data. Therefore, simply use the one C mechanism intended to retrieve information about the result of a function call: the Return Value. The mechanism to return data in C copies the function result and provides the caller access to this copy.

Out-Parameters

Out-Parameters

C only supports returning a single type from a function call and that makes it complicated to return multiple pieces of information. Therefore, return all the data with one single function call by emulating by-reference arguments with pointers.

Aggregate Instance

Aggregate Instance

C only supports returning a single type from a function call and that makes it complicated to return multiple pieces of information. Therefore, put all data that is related together into a newly defined type. Define this Aggregate Instance to contain all the related data that you want to share. Define it in the interface of your component to let the caller directly access all the data stored in the instance.

Immutable Instance

Immutable Instance

You want to provide information held in large pieces of immutable data from your component to a caller. Therefore, have an instance (for example, a struct) containing the data to share in static memory. Provide this data to users who want to access it and make sure that they cannot modify it.

Caller-Owned Buffer

Caller-Owned Buffer

You want to provide complex or large data of known size to the caller and that data is not immutable - it changes at runtime. Therefore, require the caller to provide a buffer and its size to the function that returns the complex, large data. In the function implementation, copy the required data into the buffer if the buffer size is large enough.

Callee Allocates

Callee Allocates

You want to provide complex or large data of unknown size to the caller, and that data is not immutable (it changes at runtime). Therefore, allocate a buffer with the required size inside the function that provides the complex, large data. Copy the required data into the buffer and return a pointer to that buffer.

Patterns on Data Lifetime and Ownership

Stateless Software-Module

Stateless Software-Module

You want to provide logically related functionality to your caller and you and make that functionality for the caller as easy as possible to use. Therefore, keep your functions simple and don’t build up state information in your implementation. Put all related functions into one header file and provide the caller this interface to your software-module.

Software-Module with Global State

Software-Module with Global State

You want to structure your logically related code that requires common state information and you want to make that functionality for the caller as easy as possible to use. Therefore, have one global instance to let your related functions share common resources. Put all functions that operate on that instance into one header file and provide the caller this interface to your software-module.

Caller-Owned Instance

Caller-Owned Instance

You want to provide multiple callers access to functionality with functions that depend on one another and the interaction of the caller with your functions builds up state information. Therefore, require the caller to pass an instance, which is used to store resource and state information, along to your functions. Provide explicit functions to create and destroy these instances, so that the caller can determine their lifetime.

Shared Instance

Shared Instance

You want to provide multiple callers access to functionality with functions that depend on one another and the interaction of the caller with your functions builds up state information, which your callers want to share. Therefore, require the caller to pass an instance, which is used to store resource and state information, along to your functions. Use the same instance for multiple callers and keep the ownership of that instance in your software-module.

Patterns on Flexible APIs

Header Files

Header Files

You want some functionality that you implement to be accessible for code from other implementation files, but you want to hide your implementation details from the caller. Therefore, provide function declarations in your API for any functionality you want to provide to your user. Hide any internal functions, internal data, and your function definitions (the implementations) in your implementation file and don’t provide this implementation file to the user.

Handle

Handle

You have to share state information or operate on shared resources in your function implementations, but you don’t want your caller to see or even access all that state information and shared resources. Therefore, have a function to create the context on which the caller operates and return an abstract pointer to internal data for that context. Require the caller to pass that pointer to all your functions which can then use the internal data to store state information and resources.

Dynamic Interface

Dynamic Interface

It should be possible to call implementations with slightly deviating behaviors, but it should not be necessary to duplicate any code, not even the control logic implementation and interface declaration. Therefore, define a common interface for the deviating functionalities in your API and require the caller to provide a callback function for that functionality which you then call in your function implementation.

Function Control

Function Control

You want to call implementations with slightly deviating behaviors, but you don’t want to duplicate any code, not even the control logic implementation or the interface declaration. Therefore, apply data-based abstraction. Add a parameter to your function that passes meta-information about the function call and that specifies the actual functionality to be performed.

Patterns on Iterator Interfaces

Index Access

Index Access

You want to make it possible for the user to iterate elements in your data structure in a convenient way, and it should be possible to change internals of the data structure without resulting in changes to the user’s code. Therefore, provide a function that takes an index to address the element in your underlying data structure and return the content of this element. The user calls this function in a loop to iterate over all elements.

Cursor Iterator

Cursor Iterator

You want to provide an iteration interface to your user which is robust in case the elements change during the iteration and which enables you to change the underlying data structure at a later point in time without requiring any changes to the user’s code. Therefore, create an iterator instance that points to an element in the underlying data structure. An iteration function takes this iterator instance as argument, retrieves the element the iterator currently points to, and modifies the iteration instance to point to the next element. The user then iteratively calls this function to retrieve one element at a time.

Callback Iterator

Callback Iterator

You want to provide a robust iteration interface which does not even require the user to implement a loop in the code for iterating over all elements and and which enables you to change the underlying data structure at a later point in time without requiring any changes to the user’s code. Therefore, use your existing data structure specific operations to iterate over all your elements within your implementation and call some provided user-function on each element during this iteration. This user-function gets the element content as a parameter and can then perform its operations on this element. The user just calls one function to trigger the iteration and the whole iteration takes place inside your implementation.

Patterns on Organizing Files in Modular Programs

Include Guard

Include Guard

It’s easy to include a header file multiple times, but including one and the same header file leads to compile errors if types or certain macros are part of it, because during compilation they get redefined. Therefore, protect the content of your header files against multiple inclusion so that the developer using the header files does not have to care whether it is included multiple times. Use an interlocked #ifdef statement or a #pragma once statement to achieve that.

Software-Module Directories

Software-Module Directories

Splitting code into different files increases the number of files in your codebase. Having all files in one single directory makes it difficult to keep an overview of all the files, in particular for large codebases. Therefore, put header files and implementation files that belong to a tightly coupled functionality into one directory. Name that directory after the functionality that is provided via the header files.

Global Include Directory

Global Include Directory

To include files from other software modules, you have to use relative paths like ../othersoftwaremodule/file.h. You have to know the exact location of the other header file. Therefore, have one global directory in your codebase that contains all software-module APIs. Add this directory to the global include paths in your toolchain.

Self-Contained Component

Self-Contained Component

From the directory structure it is not possible to see the dependencies in the code. Any software-module can simply include the header files from any other software-module, so it’s impossible to check dependencies in the code via the compiler. Therefore, identify software-modules that contain similar functionality and that should be deployed together. Put these software-modules into a common directory and have a designated subdirectory for their header files that are relevant for the caller.

API Copy

API Copy

You want to develop, version, and deploy the parts of your codebase independently from one another. However, to do that, you need clearly defined interfaces between the code parts and to be able to separate that code into different repositories. Therefore, to use the functionality of another component, copy its API. Build that other component separately and copy the build artifacts and its public header files. Put these files into a directory inside your component and configure that directory as a global include path.

Patterns to Escape #ifdef Hell

Avoid Variants

Avoid Variants

Using different functions for each platform makes the code harder to read and harder to write. The programmer is required to initially understand, to correctly use, and to test these multiple functions in order to achieve one single functionality across multiple platforms. Therefore, use standardized functions, which are available on all platforms. If there are no standardized functions, consider not implementing the functionality.

Isolate Primitives

Isolate Primitives

Having code variants organized with #ifdef statements makes the code unreadable. It is very difficult to follow the program flow, because it is implemented multiple times for multiple platforms. Therefore, isolate your code variants. In your implementation file, put the code handling the variants into separate functions and call these functions from your main program logic, which then only contains platform independent code.

Atomic Primitives

Atomic Primitives”

The function that contains the variants and is called by the main program is still hard to comprehend, because all the complex

  1. ifdef code was simply put into this function in order to get rid of it in the main program. Therefore, make your primitives atomic. Only handle exactly one kind of variant per function. If you handle multiple kinds of variants, for example, operating system variants and hardware variants, then have separate functions for that.

Abstraction Layer

Abstraction Layer

You want to use the functionality which handles platform variants at several places in your codebase, but you do not want to duplicate the code of that functionality. Therefore, provide an API for each functionality that requires platform specific code. Define only platform independent functions in the header file and put all platform specific

  1. ifdef code into the implementation file. The caller of your functions only includes your header file and does not have to include any platform specific files.

Split Implementation Variants

Split Implementation Variants”

The platform specific implementations still contain #ifdef statements to distinguish between code variants. That makes it difficult to see and to select which part of the code should be built for which platform. Therefore, put each variant implementation into a separate implementation file and select per file what you want to compile for which platform.

Fair Use Sources

C Language Vocabulary List (Sorted by Popularity)

C Language Programming Language, C Language Compiler, C Language Preprocessor, C Language Linker, C Language Standard, C Language ANSI C, C Language ISO C, C Language C89, C Language C90, C Language C99, C Language C11, C Language C17, C Language C18, C Language C23, C Language K&R Style, C Language Translation Unit, C Language Object File, C Language Header File, C Language Source File, C Language Macro, C Language Macro Expansion, C Language Conditional Compilation, include Directive, define Directive, if Directive, ifdef Directive, ifndef Directive, else Directive, elif Directive, endif Directive, undef Directive, line Directive, error Directive, pragma Directive, C Language Pragma once, C Language Inline Keyword, C Language Extern Keyword, C Language Static Keyword, C Language Const Keyword, C Language Volatile Keyword, C Language Restrict Keyword, C Language _Thread_local Keyword, C Language _Atomic Keyword, C Language _Noreturn Keyword, C Language _Static_assert Keyword, C Language _Alignas Keyword, C Language _Alignof Keyword, C Language _Generic Keyword, C Language _Bool Type, C Language _Complex Type, C Language _Imaginary Type, C Language Signed Keyword, C Language Unsigned Keyword, C Language Long Keyword, C Language Short Keyword, C Language Char Type, C Language Int Type, C Language Float Type, C Language Double Type, C Language Long Double Type, C Language Void Type, C Language Enum Keyword, C Language Struct Keyword, C Language Union Keyword, C Language typedef Keyword, C Language auto Keyword, C Language register Keyword, C Language Return Statement, C Language If Statement, C Language Else Statement, C Language Switch Statement, C Language Case Label, C Language Default Label, C Language For Loop, C Language While Loop, C Language Do While Loop, C Language Break Statement, C Language Continue Statement, C Language Goto Statement, C Language Label, C Language Compound Statement, C Language Block Scope, C Language File Scope, C Language Function Scope, C Language Prototype Scope, C Language Pointer Type, C Language Array Type, C Language Function Type, C Language Lvalue, C Language Rvalue, C Language Assignment Operator, C Language Arithmetic Operator, C Language Logical Operator, C Language Bitwise Operator, C Language Comparison Operator, C Language Increment Operator, C Language Decrement Operator, C Language Ternary Operator, C Language Sizeof Operator, C Language Comma Operator, C Language Type Cast, C Language Escape Sequence, C Language String Literal, C Language Character Constant, C Language Integer Constant, C Language Floating Constant, C Language Enumeration Constant, C Language Hexadecimal Constant, C Language Octal Constant, C Language UCN (Universal Character Name), C Language Wide Character Literal, C Language Wide String Literal, C Language Compound Literal, C Language Designated Initializer, C Language Flexible Array Member, C Language Variadic Function, C Language Ellipsis (...), C Language va_list Type, C Language va_start Macro, C Language va_arg Macro, C Language va_end Macro, C Language va_copy Macro, C Language setjmp Macro, C Language longjmp Function, C Language jmp_buf Type, C Language signal Handling, C Language raise Function, C Language SIG_DFL Macro, C Language SIG_IGN Macro, C Language SIG_ERR Macro, C Language <stdio.h> Header, C Language <stdlib.h> Header, C Language <string.h> Header, C Language <math.h> Header, C Language <stdbool.h> Header, C Language <stddef.h> Header, C Language <stdint.h> Header, C Language <inttypes.h> Header, C Language <ctype.h> Header, C Language <locale.h> Header, C Language <time.h> Header, C Language <assert.h> Header, C Language <signal.h> Header, C Language <setjmp.h> Header, C Language <stdarg.h> Header, C Language <fenv.h> Header, C Language <float.h> Header, C Language <complex.h> Header, C Language <tgmath.h> Header, C Language <stdalign.h> Header, C Language <stdatomic.h> Header, C Language <stdnoreturn.h> Header, C Language <threads.h> Header, C Language <uchar.h> Header, C Language I/O Stream, C Language FILE Type, C Language fpos_t Type, C Language off_t Type, C Language size_t Type, C Language ptrdiff_t Type, C Language wchar_t Type, C Language wint_t Type, C Language mbstate_t Type, C Language clock_t Type, C Language time_t Type, C Language struct tm, C Language errno Macro, C Language EDOM Macro, C Language ERANGE Macro, C Language EOF Macro, C Language NULL Pointer, C Language offsetof Macro, C Language assert Macro, C Language static_assert Keyword, C Language inline function, C Language restrict qualifier, C Language volatile qualifier, C Language atomic types, C Language atomic_flag Type, C Language atomic_bool, C Language atomic_thread_fence, C Language atomic_signal_fence, C Language memory_order, C Language memory_order_relaxed, C Language memory_order_acquire, C Language memory_order_release, C Language memory_order_acq_rel, C Language memory_order_seq_cst, C Language Alignment, C Language Alignment Requirement, C Language _Alignof Operator, C Language _Alignas Specifier, C Language Thread-Safety, C Language Thread Creation, C Language Thread Termination, C Language thrd_t Type, C Language thrd_create Function, C Language thrd_join Function, C Language thrd_exit Function, C Language thrd_sleep Function, C Language mtx_t Type, C Language mtx_init Function, C Language mtx_lock Function, C Language mtx_trylock Function, C Language mtx_unlock Function, C Language mtx_destroy Function, C Language cnd_t Type, C Language cnd_init Function, C Language cnd_signal Function, C Language cnd_broadcast Function, C Language cnd_wait Function, C Language cnd_timedwait Function, C Language cnd_destroy Function, C Language tss_t Type, C Language tss_create Function, C Language tss_delete Function, C Language tss_set Function, C Language tss_get Function, C Language call_once Function, C Language once_flag Type, C Language C Preprocessing, C Language Tokenization, C Language Trigraph, C Language Digraph, C Language Universal Character Names, C Language Escape Sequences, C Language Wide Character, C Language Execution Character Set, C Language Source Character Set, C Language String Concatenation, C Language Translation Phases, C Language Undefined Behavior, C Language Implementation-Defined Behavior, C Language Unspecified Behavior, C Language Sequence Point, C Language Sequenced Before, C Language Sequenced After, C Language Unsequenced, C Language Scalar Type, C Language Aggregate Type, C Language POD (Plain Old Data), C Language Object Lifetime, C Language Storage Duration, C Language Static Storage Duration, C Language Thread Storage Duration, C Language Automatic Storage Duration, C Language Allocated Storage Duration, C Language Allocation Functions, C Language malloc Function, C Language calloc Function, C Language realloc Function, C Language free Function, C Language aligned_alloc Function, C Language abort Function, C Language atexit Function, C Language at_quick_exit Function, C Language quick_exit Function, C Language exit Function, C Language getenv Function, C Language system Function, C Language bsearch Function, C Language qsort Function, C Language abs Function, C Language labs Function, C Language llabs Function, C Language div Function, C Language ldiv Function, C Language lldiv Function, C Language rand Function, C Language srand Function, C Language atof Function, C Language atoi Function, C Language atol Function, C Language atoll Function, C Language strtod Function, C Language strtof Function, C Language strtold Function, C Language strtol Function, C Language strtoul Function, C Language strtoll Function, C Language strtoull Function, C Language mblen Function, C Language mbtowc Function, C Language wctomb Function, C Language mbstowcs Function, C Language wcstombs Function, C Language memset Function, C Language memcpy Function, C Language memmove Function, C Language memcmp Function, C Language memchr Function, C Language strcpy Function, C Language strncpy Function, C Language strcat Function, C Language strncat Function, C Language strcmp Function, C Language strncmp Function, C Language strchr Function, C Language strrchr Function, C Language strstr Function, C Language strspn Function, C Language strcspn Function, C Language strlen Function, C Language strerror Function, C Language strtok Function, C Language strcoll Function, C Language strxfrm Function, C Language sprintf Function, C Language fprintf Function, C Language printf Function, C Language scanf Function, C Language fscanf Function, C Language sscanf Function, C Language vprintf Function, C Language vfprintf Function, C Language vsprintf Function, C Language vsnprintf Function, C Language fgetc Function, C Language fgets Function, C Language fputc Function, C Language fputs Function, C Language getchar Function, C Language putchar Function, C Language puts Function, C Language ungetc Function, C Language fread Function, C Language fwrite Function, C Language fseek Function, C Language ftell Function, C Language rewind Function, C Language fgetpos Function, C Language fsetpos Function, C Language feof Function, C Language ferror Function, C Language clearerr Function, C Language fflush Function, C Language fopen Function, C Language freopen Function, C Language fclose Function, C Language remove Function, C Language rename Function, C Language tmpfile Function, C Language tmpnam Function, C Language setbuf Function, C Language setvbuf Function, C Language perror Function, C Language fwide Function, C Language wprintf Function, C Language fwprintf Function, C Language swprintf Function, C Language wscanf Function, C Language fwscanf Function, C Language swscanf Function, C Language towlower Function, C Language towupper Function, C Language iswalpha Function, C Language iswcntrl Function, C Language iswdigit Function, C Language iswlower Function, C Language iswgraph Function, C Language iswprint Function, C Language iswpunct Function, C Language iswspace Function, C Language iswupper Function, C Language iswxdigit Function, C Language wcslen Function, C Language wcsnlen Function, C Language wcscmp Function, C Language wcsncmp Function, C Language wcscpy Function, C Language wcsncpy Function, C Language wcscat Function, C Language wcsncat Function, C Language wcschr Function, C Language wcsrchr Function, C Language wcsstr Function, C Language wcspbrk Function, C Language wcsspn Function, C Language wcscspn Function, C Language wcstok Function, C Language wmemset Function, C Language wmemcpy Function, C Language wmemmove Function, C Language wmemcmp Function, C Language wmemchr Function, C Language wcscoll Function, C Language wcsxfrm Function, C Language wcsftime Function, C Language mktime Function, C Language difftime Function, C Language ctime Function, C Language gmtime Function, C Language localtime Function, C Language strftime Function, C Language clock Function, C Language CLOCKS_PER_SEC Macro, C Language FLT_EVAL_METHOD Macro, C Language FLT_ROUNDS Macro, C Language FLT_DIG Macro, C Language DBL_DIG Macro, C Language LDBL_DIG Macro, C Language FLT_RADIX Macro, C Language FLT_MANT_DIG Macro, C Language DBL_MANT_DIG Macro, C Language LDBL_MANT_DIG Macro, C Language FLT_EPSILON Macro, C Language DBL_EPSILON Macro, C Language LDBL_EPSILON Macro, C Language FLT_MAX Macro, C Language DBL_MAX Macro, C Language LDBL_MAX Macro, C Language FLT_MIN Macro, C Language DBL_MIN Macro, C Language LDBL_MIN Macro, C Language HUGE_VAL Macro, C Language HUGE_VALF Macro, C Language HUGE_VALL Macro, C Language INFINITY Macro, C Language NAN Macro, C Language FP_INFINITE Macro, C Language FP_NAN Macro, C Language FP_NORMAL Macro, C Language FP_SUBNORMAL Macro, C Language FP_ZERO Macro, C Language fpclassify Function, C Language isfinite Function, C Language isinf Function, C Language isnan Function, C Language isnormal Function, C Language signbit Function, C Language isgreater Function, C Language isgreaterequal Function, C Language isless Function, C Language islessequal Function, C Language islessgreater Function, C Language isunordered Function, C Language sin Function, C Language cos Function, C Language tan Function, C Language asin Function, C Language acos Function, C Language atan Function, C Language atan2 Function, C Language sinh Function, C Language cosh Function, C Language tanh Function, C Language asinh Function, C Language acosh Function, C Language atanh Function, C Language exp Function, C Language frexp Function, C Language ldexp Function, C Language log Function, C Language log10 Function, C Language log2 Function, C Language exp2 Function, C Language expm1 Function, C Language log1p Function, C Language sqrt Function, C Language cbrt Function, C Language hypot Function, C Language erf Function, C Language erfc Function, C Language tgamma Function, C Language lgamma Function, C Language ceil Function, C Language floor Function, C Language fmod Function, C Language remainder Function, C Language remquo Function, C Language fdim Function, C Language fmax Function, C Language fmin Function, C Language fma Function, C Language fabs Function, C Language trunc Function, C Language round Function, C Language lround Function, C Language llround Function, C Language nearbyint Function, C Language rint Function, C Language lrint Function, C Language llrint Function, C Language copysign Function, C Language nextafter Function, C Language nexttoward Function, C Language fenv_t Type, C Language fexcept_t Type, C Language feclearexcept Function, C Language feraiseexcept Function, C Language fesetexceptflag Function, C Language fegetexceptflag Function, C Language fetestexcept Function, C Language fegetround Function, C Language fesetround Function, C Language fegetenv Function, C Language fesetenv Function, C Language feupdateenv Function, C Language FENV_ACCESS Macro, C Language ATOMIC_BOOL_LOCK_FREE Macro, C Language ATOMIC_CHAR_LOCK_FREE Macro, C Language ATOMIC_WCHAR_T_LOCK_FREE Macro, C Language ATOMIC_SHORT_LOCK_FREE Macro, C Language ATOMIC_INT_LOCK_FREE Macro, C Language ATOMIC_LONG_LOCK_FREE Macro, C Language ATOMIC_LLONG_LOCK_FREE Macro, C Language ATOMIC_POINTER_LOCK_FREE Macro, C Language atomic_is_lock_free Function, C Language atomic_store Function, C Language atomic_load Function, C Language atomic_exchange Function, C Language atomic_compare_exchange_strong Function, C Language atomic_compare_exchange_weak Function, C Language atomic_fetch_add Function, C Language atomic_fetch_sub Function, C Language atomic_fetch_or Function, C Language atomic_fetch_xor Function, C Language atomic_fetch_and Function, C Language atomic_thread_fence Function, C Language atomic_signal_fence Function, C Language alignas Specifier, C Language alignof Operator, C Language noreturn Function Specifier, C Language static_assert Macro, C Language Generic Selection, C Language _Generic Keyword, C Language _Atomic Keyword, C Language Complex Type, C Language Imaginary Type, C Language creal Function, C Language cimag Function, C Language cabs Function, C Language carg Function, C Language conj Function, C Language cproj Function, C Language cexp Function, C Language clog Function, C Language cpow Function, C Language csin Function, C Language ccos Function, C Language ctan Function, C Language casin Function, C Language cacos Function, C Language catan Function, C Language csinh Function, C Language ccosh Function, C Language ctanh Function, C Language casinh Function, C Language cacosh Function, C Language catanh Function, C Language cexpf Function, C Language clogf Function, C Language cpowf Function, C Language csinf Function, C Language ccosf Function, C Language ctanf Function, C Language casinf Function, C Language cacosf Function, C Language catanf Function, C Language cabsf Function, C Language cargf Function, C Language conjf Function, C Language cprojf Function, C Language csinhf Function, C Language ccoshf Function, C Language ctanhf Function, C Language casinhf Function, C Language cacoshf Function, C Language catanhf Function, C Language crealf Function, C Language cimagf Function, C Language creall Function, C Language cimagl Function, C Language fabsl Function, C Language sqrtl Function, C Language sinl Function, C Language cosl Function, C Language tanl Function, C Language asinl Function, C Language acosl Function, C Language atanl Function, C Language atan2l Function, C Language sinhl Function, C Language coshl Function, C Language tanhl Function, C Language acoshl Function, C Language atanhl Function, C Language expl Function, C Language frexpl Function, C Language ldexpl Function, C Language logl Function, C Language log10l Function, C Language log2l Function, C Language exp2l Function, C Language expm1l Function, C Language log1pl Function, C Language cbrtl Function, C Language hypotl Function, C Language erfl Function, C Language erfcl Function, C Language tgammal Function, C Language lgammal Function, C Language ceill Function, C Language floorl Function, C Language fmodl Function, C Language remainderl Function, C Language remquol Function, C Language fdiml Function, C Language fmaxl Function, C Language fminl Function, C Language fmal Function, C Language truncl Function, C Language roundl Function, C Language lroundl Function, C Language llroundl Function, C Language nearbyintl Function, C Language rintl Function, C Language lrintl Function, C Language llrintl Function, C Language copysignl Function, C Language nextafterl Function, C Language nexttowardl Function, C Language SIGINT Macro, C Language SIGTERM Macro, C Language SIGSEGV Macro, C Language SIGILL Macro, C Language SIGABRT Macro, C Language SIGFPE Macro, C Language int8_t Type, C Language int16_t Type, C Language int32_t Type, C Language int64_t Type, C Language uint8_t Type, C Language uint16_t Type, C Language uint32_t Type, C Language uint64_t Type, C Language uintptr_t Type, C Language intptr_t Type, C Language intmax_t Type, C Language uintmax_t Type, C Language int_least8_t Type, C Language int_least16_t Type, C Language int_least32_t Type, C Language int_least64_t Type, C Language uint_least8_t Type, C Language uint_least16_t Type, C Language uint_least32_t Type, C Language uint_least64_t Type, C Language int_fast8_t Type, C Language int_fast16_t Type, C Language int_fast32_t Type, C Language int_fast64_t Type, C Language uint_fast8_t Type, C Language uint_fast16_t Type, C Language uint_fast32_t Type, C Language uint_fast64_t Type, C Language INTMAX_MAX Macro, C Language INTMAX_MIN Macro, C Language UINTMAX_MAX Macro, C Language SIZE_MAX Macro, C Language PTRDIFF_MAX Macro, C Language PTRDIFF_MIN Macro, C Language WCHAR_MAX Macro, C Language WCHAR_MIN Macro, C Language WINT_MAX Macro, C Language WINT_MIN Macro, C Language MB_LEN_MAX Macro, C Language RSIZE_MAX Macro, C Language errno_t Type, C Language rsize_t Type, C Language K&R C, C Language ISO/IEC 9899 Standard, C Language Translation Phase 1, C Language Translation Phase 2, C Language Trigraph Replacement, C Language Universal Character Name Mapping, C Language Adjacent String Literal Concatenation, C Language Escape Sequence Processing, C Language Preprocessing Directives Execution, C Language Macro Replacement, C Language _Pragma Operator, ), #), C Language Conditional Inclusion, C Language __FILE__ Macro, C Language __LINE__ Macro, C Language __DATE__ Macro, C Language __TIME__ Macro, C Language __STDC__ Macro, C Language __STDC_VERSION__ Macro, C Language __STDC_HOSTED__ Macro, C Language __func__ Identifier, C Language Diagnostics, C Language Implementation Limits, C Language Implementation-defined Behavior, C Language Strict Aliasing Rule, C Language Type Qualifiers, C Language Conversion Rank, C Language Arithmetic Conversions, C Language Integer Promotions, C Language Usual Arithmetic Conversions, C Language Balancing Types, C Language Function Prototype, C Language Old-style Declaration, C Language Prototype Scope Variable, C Language Tentative Definition, C Language Linkage, C Language Internal Linkage, C Language External Linkage, C Language No Linkage, C Language Incomplete Type, C Language Complete Type, C Language Composite Type, C Language Decayed Type, C Language Adjusted Type, C Language Scalar Promotion, C Language POD Type (pre C11), C Language Object Representation, C Language Value Representation, C Language Effective Type, C Language Character Encoding, C Language Locale, C Language Localization Functions

C Language: C Fundamentals, C Inventor - C Language Designer: Dennis Ritchie in 1972; C Standards: ANSI X3J11 (ANSI C); ISO/IEC JTC 1 (Joint Technical Committee 1) / SC 22 (Subcommittee 22) / WG 14 (Working Group 14) (ISO C); C Keywords, C Pointers, C Data Structures - C Algorithms, C Syntax, C Memory Management, C Recursion, C on Android, C on Linux, C on macOS, C on Windows, C Installation, C Containerization, C Configuration, C Compiler, C IDEs (CLion), C Development Tools, C DevOps - C SRE, C Data Science - C DataOps, C Machine Learning, C Deep Learning, C Concurrency, C History, C Bibliography, Manning C Programming Series, C Glossary, C Topics, C Courses, C Standard Library, C Libraries, C Frameworks, C Research, C GitHub, Written in C, C Popularity, C Awesome List, C Versions. (navbar_c)

Design Patterns: Design Patterns - Elements of Reusable Object-Oriented Software by GoF, Awesome Design Patterns, Awesome Software Design, Pattern, Design, Anti-Patterns, Code Smells, Best Practices, Software Architecture, Software Design, Design Principles, Design Patterns Bibliography, C Language Design Patterns, CPP Design Patterns | C++ Design Patterns, C Sharp Design Patterns | Design Patterns, Golang Design Patterns, Java Design Patterns, JavaScript Design Patterns, Kotlin Design Patterns, Node.js Design Patterns, Python Design Patterns, TypeScript Design Patterns, Scala Design Patterns, Swift Design Patterns. (navbar_designpatterns)


Cloud Monk is Retired ( for now). Buddha with you. © 2025 and Beginningless Time - Present Moment - Three Times: The Buddhas or Fair Use. Disclaimers

SYI LU SENG E MU CHYWE YE. NAN. WEI LA YE. WEI LA YE. SA WA HE.


fluent_c_-_principles_practices_and_patterns_topics.txt · Last modified: 2025/02/01 06:57 by 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki