-
имена файлов в проекте дожны быть на английском, в нижнем регистре. Разделитель между словами символ подчеркивания
_
-
имена папок также на английском, в нижнем регистре. Разделитель между словами символ тире
-
src\
src\coap-proto
- coap_proto.c /* c source file */
- coap_proto.h /* c header file */
src\modem-driver
- modem_routines.c /* c source file */
- modem_routines.h /* c header file */
-
в начало каждого файла помещается заголовок с названием/авторством/датой-создания/копирайтом. Современные IDE позволяют настроить шаблоны для автоматического добавления заголовков.
-
Для
Eclipse
,'Window'->'Preferences'->'C/C++'->'Code Style'->'Code Templates'
/*
* Copyright (c) ${year} ${company}. All Rights Reserved.
* ${company} proprietary and confidential.
* Use is subject to license terms.
*
* @Project: ${project_name}
* @File: ${file_name}
*
* @Author: ${user}
* @Created: ${date}
*
*/
- Используем типы из страндартной библиотеки С. Подключаем через:
#include <stdint.h>
#include <stdbool.h>
/**
* uint8_t
* uint16_t
* uint32_t
* ...
* bool
*/
- Имена переменных и функций в нижнем регистре, слова разделяются через символ подчеркивания _
uint32_t mmu_value;
void * pointer_on_void;
void send_data_to_modem(uint8_t *buf, const uint16_t data_len);
- Имена новых типов на основе структур в нижнем регистре и начинаются с двух символов подчеркивания
typedef struct __my_new_type {
uint32_t type;
uint32_t handle;
} __my_new_type;
- Имена констант, дефайнов, типов данных на основе функций
- имена в верхнем регистре
#define BUFFER_SIZE 64
static const uint32_t BUFFER_SIZE = 100;
typedef void (*TERMINAL_CALLBACK)(void * arg);
- Локальные переменные
- локальные переменные всегда должны быть определены в начале тела функции.
- присвоение значений идет после определения.
void send_data_to_modem(uint8_t *buf, const uint16_t data_len)
{
uint32_t var1;
uint32_t var2;
/* assigement */
var1 = 0;
var2 = 100;
/* code */
}
- Глобальные переменные и функции
- все переменные и функции, которые видимы вне файла, должны начинаться с имени модуля, относящегося к ним. Так проще знать, где искать определения для функций и переменных.
extern char * dcp_router;
void dcp_global_func(char * buf);
- Статические функции
- именование свободное, начинать с имени модуля не обязательно
static void some_static_func(char * buf);
- Отступы, пробелы табуляции
-
для отступов используем только пробелы (табуляции не используем)
-
стандартный отступ равен 4 пробела
- Определение функций
- открывающая скобка с новой строки
static uint32_t my_func(uint8_t * param1, uint32_t param2)
{
/* code is here */
}
- Определение указателей
uint32_t * pointer; /* допустимо */
uint32_t *pointer; /* допустимо */
uint32_t* pointer; /* не допустимо */
- Управляющие конструкции (for/while/if)
- после ключевого слова пробел
- открывающая фигурная скобка на той же строке
/* цикл for */
for (...) {
}
/* условие if */
if (...) {
} else if () {
} else {
}
/* цикл do-while */
do {
} while (...);
/* цикл while */
while (...) {
}
- Комментарии
/* Одиночная строка комментария выглядит примерно как эта строка. */
/**
* Многострочный коменнтарий должен быть оформлен как показано тут. Комментарии должны
* предпочительно быть полными предложениями, заполненными так, чтобы быть похожими на
* реальные параграфы.
*/
http://www.maultech.com/chrislott/resources/cstyle/indhill-cstyle.pdf
https://www.gnu.org/prep/standards/standards.html#Formatting
https://users.ece.cmu.edu/~eno/coding/CCodingStandard.html#pnames