C Coding Standards
When reviewing or generating C code, follow these rules:
File Naming
- •Source files: snake_case with
.cextension (e.g.,user_service.c,data_parser.c) - •Header files: snake_case with
.hextension (e.g.,user_service.h,data_parser.h) - •Keep names short but descriptive (max ~20 characters)
Header Guards
- •Format: UPPER_SNAKE_CASE with
_Hsuffix - •Include path in guard: (e.g.,
PROJECT_MODULE_FILE_H)
c
#ifndef USER_SERVICE_H #define USER_SERVICE_H // content #endif /* USER_SERVICE_H */
Variable Naming
- •Local variables: snake_case (e.g.,
user_count,buffer_size,is_valid) - •Global variables: snake_case with
g_prefix (e.g.,g_config,g_instance_count) - •Static variables: snake_case with
s_prefix (e.g.,s_initialized,s_cache) - •Pointers: Include
porptrsuffix when helpful (e.g.,user_ptr,buffer_p)
Constant/Macro Naming
- •Macros: UPPER_SNAKE_CASE (e.g.,
MAX_BUFFER_SIZE,DEFAULT_TIMEOUT) - •Enum values: UPPER_SNAKE_CASE (e.g.,
STATUS_OK,ERROR_INVALID_INPUT) - •Compile-time constants: UPPER_SNAKE_CASE with
#define
Function Naming
- •Functions: snake_case (e.g.,
calculate_total(),parse_input()) - •Module prefix: Use module name prefix (e.g.,
user_create(),user_destroy()) - •Static functions: snake_case, no prefix needed (internal to file)
- •Init/cleanup pairs: Use
_init()and_cleanup()or_create()and_destroy()
Type Naming
- •Structs: snake_case with
_tsuffix or PascalCase (e.g.,user_data_torUserData) - •Typedefs: snake_case with
_tsuffix (e.g.,user_id_t,callback_fn_t) - •Enums: snake_case with
_esuffix for type (e.g.,status_e)
Organization
- •Header includes at top (system headers, then project headers)
- •Macro definitions after includes
- •Type definitions (structs, enums, typedefs)
- •Function prototypes
- •Global/static variable declarations
- •Function implementations