C Coding Standards
When reviewing or generating C code, follow these rules:
File Naming
-
Source files: snake_case with .c extension (e.g., user_service.c , data_parser.c )
-
Header files: snake_case with .h extension (e.g., user_service.h , data_parser.h )
-
Keep names short but descriptive (max ~20 characters)
Header Guards
-
Format: UPPER_SNAKE_CASE with _H suffix
-
Include path in guard: (e.g., PROJECT_MODULE_FILE_H )
#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 p or ptr suffix 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 _t suffix or PascalCase (e.g., user_data_t or UserData )
-
Typedefs: snake_case with _t suffix (e.g., user_id_t , callback_fn_t )
-
Enums: snake_case with _e suffix 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