文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

这才是像样的C语言编程规范!

2024-12-02 02:21

关注

最重要的一条规则

编写代码时最重要的一条规则是:检查周围的代码并尝试模仿它。

作为维护人员,如果收到的补丁明显与周围代码的编码风格不同,这是令人沮丧的。这是不尊重人的,就像某人穿着泥泞的鞋子走进一间一尘不染的房子。

因此,无论本文推荐的是什么,如果已经编写了代码并且您正在对其进行修补,请保持其当前的样式一致,即使它不是您最喜欢的样式。

一般性的规则

这里列出了最明显和最重要的一般规则。在你继续阅读其他章节之前,请仔细检查它们:

int32_t a = sum(4, 3);              
int32_t a = sum (4, 3);
size_t i;
for (i = 0; i < 5; ++i) {
}
for (i = 0; i < 5; ++i){
}
for (i = 0; i < 5; ++i)
{
}
int32_t a;
a = 3 + 4;
for (a = 0; a < 5; ++a)
a=3+4;
a = 3+4;
for (a=0;a<5;++a)
func_name(5, 4);        
func_name(4,3);
static int32_t a;       
static int32_t b = 4;
static int32_t a = 0;
void my_func(void) {
static int32_t* ptr;
static char abc = 0;
}
void my_func(void) {
char a;
char b;
char a, b;
}

     i. 自定义结构和枚举

     ii. 整数类型,更宽的无符号类型优先

     iii. 单/双浮点

int my_func(void) {

my_struct_t my;
my_struct_ptr_t* p;

uint32_t a;
int32_t b;
uint16_t c;
int16_t g;
char h;


double d;
float f;
}

for (size_t i = 0; i < 10; ++i)

size_t i;
for (i = 0; i < 10; ++i) {
if (...) {
break;
}
}
if (i * 10) {
}

size_t i;
for (i = 0; i < 10; ++i) ...
void a(void) {

int32_t a, b = sum(1, 2);

int32_t a, b;
b = sum(1, 2);

uint8_t a = 3, b = 4;
}

uint8_t status;
status = 0;

#include
bool status = true;
void* ptr;


if (ptr * NULL || ptr != NULL) {
}

if (ptr || !ptr) {
}
int32_t a = 0;
...
a++;
++a;
for (size_t j = 0; j < 10; ++j) {}

void
my_func(const void* d) {
}

void
my_func(const void* const d) {
}

void
my_func(const size_t len) {
}

void
my_func(void* const d) {
}


void send_data(const void* data, size_t len) {

const uint8_t* d = data;
}
void send_data(const void* data, int len) {
}

#include
void
my_func(size_t size) {
int32_t* arr;
arr = malloc(sizeof(*arr) * n);
arr = malloc(sizeof *arr * n);
if (arr * NULL) {

}
free(arr);
}

void
my_func(size_t size) {
int32_t arr[size];
}
size_t length = 5;  
uint8_t is_ok = 0;
if (length)
if (length > 0)
if (length * 0)
if (is_ok)
if (!is_ok)
if (is_ok * 1)
if (is_ok * 0)

注释相关的规则






void my_func(void) {
char a, b;
a = call_func_returning_char_a(a);
b = call_func_returning_char_a_but_func_name_is_very_long(a);
}

函数定义的规则


void my_func(void);
void myfunc(void);

void MYFunc(void);
void myFunc();

const char* my_func(void);
my_struct_t* my_func(int32_t a, int32_t b);

const char *my_func(void);
my_struct_t * my_func(void);

void set(int32_t a);
my_type_t get(void);
my_ptr_t* get_ptr(void);

void set(int32_t a);
const char * get(void);

int32_t
foo(void) {
return 0;
}

static const char*
get_string(void) {
return "Hello world!\r\n";
}

int32_t foo(void) {
return 0;
}

变量相关的规则


int32_t a;
int32_t my_var;
int32_t myvar;

int32_t A;
int32_t myVar;
int32_t MYVar;
void foo(void) {
int32_t a, b;
char a;
char b;
}
void foo(void) {
int32_t a;
a = bar();
int32_t b;
}
int32_t a, b;
a = foo();
if (a) {
int32_t c, d;
c = foo();
int32_t e;
}

char* a;

char *a;
char * a;

char *p, *n;

结构、枚举类型定义

 1. 当结构体仅用名称声明时,它的名称后不能包含_t后缀。

struct struct_name {
char* a;
char b;
};

 2. 当只使用typedef声明结构时,它的名称后面必须包含_t后缀。

typedef struct {
char* a;
char b;

} struct_name_t;

 3. 当结构用name和typedef声明时,它不能包含t作为基本名称,它必须在它的名称后面包含t后缀作为typedef部分。

typedef struct struct_name {
char* a;
char b;
char c;
} struct_name_t;


typedef struct {
int32_t a, b;
} a;

typedef struct {
int32_t a;
int32_t b;
} a_t;

struct name_t {
int32_t a;
int32_t b;
};

typedef enum {
MY_ENUM_TESTA,
my_enum_testb,
} my_enum_t;

a_t a = {
.a = 4,
.b = 5,
};

a_t = {1, 2};


typedef uint8_t (*my_func_typedef_fn)(uint8_t p1, const char* p2);

复合语句规则


if (c) {
do_a();
} else {
do_b();
}

if (c)
do_a();
else
do_b();

if (c) do_a();
else do_b();

if (a) {
} else if (b) {
} else {
}

if (a) {
}
else {
}

if (a) {
}
else
{
}
} else {
}

if (a) {
}
else {
}

if (a) {
}
else
{
}

do {
int32_t a;
a = do_a();
do_b(a);
} while (check());

do
{

} while (check());

do {

}
while (check());
if (a) {
do_a();
} else {
do_b();
if (c) {
do_c();
}
}
if (a) do_b();
else do_c();
if (a) do_a(); else do_b();

while (is_register_bit_set()) {}

while (is_register_bit_set());
while (is_register_bit_set()) { }
while (is_register_bit_set()) {
}

while (*addr & (1 << 13)) {}
while (*addr & (1 << 13)) { }
while (*addr & (1 << 13)) {
}
while (*addr & (1 << 13));

int32_t a = 0;
while (a < 10) {
.
..
...
++a;
}

for (size_t a = 0; a < 10; ++a) {
}

for (size_t a = 0; a < 10; ) {
if (...) {
++a;
}
}

分支语句规则



switch (check()) {
case 0:
do_a();
break;
case 1:
do_b();
break;
default:
break;
}

switch (check()) {
case 0:
do_a();
break;
case 1:
do_b();
break;
default:
break;
}

switch (check()) {
case 0:
do_a();
break;
case 1:
do_b();
break;
default:
break;
}

switch (var) {
case 0:
do_job();
break;
default: break;
}

switch (var) {
case 0:
do_job();
break;
}
switch (a) {

case 0: {
int32_t a, b;
char c;
a = 5;

break;
}

case 1:
{
int32_t a;
break;
}

case 2: {
int32_t a;
}
break;
}

宏和预处理指令


#define MY_MACRO(x) ((x) * (x))

#define square(x) ((x) * (x))

#define MIN(x, y) ((x) < (y) ? (x) : (y))

#define MIN(x, y) x < y ? x : y

#define MIN(x, y) (x) < (y) ? (x) : (y)
#define SUM(x, y) (x) + (y)

int32_t x = 5 * SUM(3, 4);
int32_t x = 5 * (3) + (4);

#define MIN(x, y) ((x) < (y) ? (x) : (y))
#define SUM(x, y) ((x) + (y))
typedef struct {
int32_t px, py;
} point_t;
point_t p;


#define SET_POINT(p, x, y) (p)->px = (x); (p)->py = (y)
SET_POINT(&p, 3, 4);
(&p)->px = (3); (&p)->py = (4);

if (a)
if (b)
SET_POINT(&p, 3, 4);
else
SET_POINT(&p, 5, 6);

if (a)
if (b)
(&p)->px = (3); (&p)->py = (4);
else
(&p)->px = (5); (&p)->py = (6);

if (a)
if (b)
(&p)->px = (3);
(&p)->py = (4);
else
(&p)->px = (5);
(&p)->py = (6);


#define SET_POINT(p, x, y) do { (p)->px = (x); (p)->py = (y); } while (0)

#define SET_POINT(p, x, y) do { \
(p)->px = (x); \
(p)->py = (y); \
} while (0)

if (a)
if (b)
do { (&p)->px = (3); (&p)->py = (4); } while (0);
else
do { (&p)->px = (5); (&p)->py = (6); } while (0);


if (a) {
if (b) {
SET_POINT(&p, 3, 4);
} else {
SET_POINT(&p, 5, 6);
}
}

#if defined(XYZ)
#if defined(ABC)

#endif
#else

#endif

#if defined(XYZ)
#if defined(ABC)

#endif
#else

#endif
文档

static
type_t* list;

typedef struct {
int32_t x;
int32_t y;
int32_t size;
} point_t;


typedef enum {

COLOR_RED,
COLOR_GREEN,
COLOR_BLUE,
} point_color_t;

int32_t
sum(int32_t a, int32_t b) {
return a + b;
}

void
void_sum(int32_t a, int32_t b, int32_t* result) {
*result = a + b;
}

typedef enum {
MY_ERR,
MY_OK
} my_enum_t;

my_enum_t

chec_value(void) {
return MY_OK;
}

const void *
get_data(const void* in) {
return in;
}

#define MIN(x, y) ((x) < (y) ? (x) : (y))

头/源文件






#ifndef ...
extern int32_t my_variable;
#endif

int32_t my_variable;

#ifndef TEMPLATE_HDR_H
#define TEMPLATE_HDR_H

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
}
#endif
#endif
来源:C语言与C++编程内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯