关于编成规范-命名规则的浅谈

jernymy 2009-11-17 12:36:05


关于编成规范-命名规则的浅谈

本命名取自“匈牙利”法,仅供参考。

数据类型的命名规则参考:
定义类型:
前缀 类型 类型描述 示例 所占字节(Win32) 有效值 取值范围
b Boolena-布尔 1Bit的标志 bool bFlag 4 (TRUE/FALSE) (0x0 ~0x1)
/* typedef int bool */
----------------------------------------------------------------------------------------
by Byte 字节 无符号的8bit字节 unsigned char byValue; 1 0 ~255 (0x0 ~0xFF)
ch Char 字符 有符号的8bit字节 signed char chValue; 1 -128~127 (0x80~0x7F)
----------------------------------------------------------------------------------------
w 不带符号的Word字 无符号的16bit整数 unsigned short wValue; 2 0 ~65535 (0x0 ~0xFFFF)
sw 带符号的16位整形数 有符号的16bit整数 signed short swValue; 2 -32768~32767 (0x8000~0x7FFF)
----------------------------------------------------------------------------------------
dw 不带符号的doubleword字 无符号的32bit整数 unsigned int dwValue; 4 0 ~4294967295 (0x0 ~0xFFFFFFFF)
n 带符号的32位整形数 有符号的32bit整数 signed int nValue; 4 -2147483648~2147483647 (0x80000000~0x7FFFFFFF)
----------------------------------------------------------------------------------------
f 单精度浮点数 单精度浮点数 float fValue; 4
d 双精度浮点数 双精度浮点数 double dValue; 8
----------------------------------------------------------------------------------------
p 指针(pointer) 指针 char *pchName; 4
pc const指针(pointer) const指针 const char *pcchName; /
/* unsigned char *pbyData; / unsigned short *pwData; */
/* const int *pcnData; / unsigned int *pdwData; */
----------------------------------------------------------------------------------------
t typedef自定义类型 struct结构体等类型 TNameInfo tName; /
pt 自定义类型指针 struct结构体指针等 PTNameInfo *ptName; /
----------------------------------------------------------------------------------------
a Array数组 数组 char achName[20]; /
aa 二位Array数组 多位数组 unsigned char aabyName[4][2]; /
----------------------------------------------------------------------------------------
ap 存放指针的数组 存放指针的数组 char *apchName[2]; /
pa 指向数组的指针 指向数组的指针 unsigned char *pabyName; /
----------------------------------------------------------------------------------------
em enum枚举类型 枚举类型 EM_NAME emName; 4
c class类 class类 CName cName; /
----------------------------------------------------------------------------------------
pf 函数指针(pointer func) 函数指针 typedef int (*pfMsgFunc)(int type);
----------------------------------------------------------------------------------------
s_ 静态变量(static) 静态变量 static int s_nValue;
g_ 全局变量(global) 全局变量 int g_nValue;
m_ 类的数据成员(member) 类的数据成员 int m_nValue;


函数名的命名规则参考:

1. 函数名的首字母建议大写,函数名采用大小写字母结合的形式
int GetMaxValue(void)
{
do someting;
}

2. 定义函数时,若函数无返回值,请冠以void 函数名格式;若函数无参数,请在参数中写入void格式;
void InitData(void)
{
do someting;
}

1. 全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)。
DrawBox(void); // 全局函数

2. 用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。
void SetValue(int nValue)
{
g_nValue = nValue;
}

int GetValue(void)
{
return g_nValue;
}

3. 回调函数最好出现“CB”字符;
typedef int (*pfTimerCB)(int type);
CreateTimer(g_TaskTimer, TaskTimerCB, NULL);

3. 在同一软件产品内,避免重名的函数出现
我们在不同的文件中都可以通过定义同样的函数
模块A
static void InitData(void); // 最好改成 static void InitAData(void);
模块B
static void InitData(void); // 最好改成 static void InitBData(void);

4. 函数名的长度最好小于30字符内。可以使用缩略词语,但是要有必要的全词注释。
tSysPara *GetSysPara(void) // tSystemPara *GetSystemParameter(void)

5. 一个函数代码最好控制在100行以内,一个模块文件,代码最好控制在1000行以内。

6. 最后,还有一点小小的建议,就是无论我们使用那种工具编写代码,VC6.0,SourceInsignt,UltraEdit,等
请按照格式排板,对齐,并将tab转换成4个空格,这样便于察看,修改等。


代码示例:与零值比较(摘自林锐博士-高质量C++/C 编程指南)

1. 布尔变量与零值比较
不可将布尔变量直接与TRUE、FALSE 或者1、0 进行比较。
根据布尔类型的语义,零值为“假”(记为FALSE),任何非零值都是“真”(记为TRUE)。TRUE 的值究竟是什么并没有统一的标准。例如Visual C++ 将TRUE 定义为1,而Visual Basic 则将TRUE 定义为-1。
假设布尔变量名字为flag,它与零值比较的标准if 语句如下:
if (flag) // 表示flag 为真
if (!flag) // 表示flag 为假
其它的用法都属于不良风格,例如:
if (TRUE == flag)
if (1 == flag)
if (FALSE == flag)
if (0 == flag)

2. 整型变量与零值比较
应当将整型变量用“==”或“!=”直接与0 比较。
假设整型变量的名字为value,它与零值比较的标准if 语句如下:
if (0 == value)
if (0 != value)
不可模仿布尔变量的风格而写成
if (value) // 会让人误解 value 是布尔变量
if (!value)

3. 浮点变量与零值比较
不可将浮点变量用“==”或“!=”与任何数字比较。
千万要留意,无论是float 还是double 类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。
假设浮点变量的名字为x,应当将
if (0.0 == x) // 隐含错误的比较
转化为
if ((x>=-EPSINON) && (x<=EPSINON))
其中EPSINON 是允许的误差(即精度)。
C++
const float EPSINON = 0.00001;
C
#define EPSINON (float)0.00001

4. 指针变量与零值比较
应当将指针变量用“==”或“!=”与NULL 比较。
指针变量的零值是“空”(记为NULL)。尽管NULL 的值与0 相同,但是两者意义不同。假设指针变量的名字为p,它与零值比较的标准if 语句如下:
if (NULL == p) // p 与NULL 显式比较,强调p 是指针变量
if (NULL != p)
不要写成
if (0 == p) // 容易让人误解p 是整型变量
if (0 != p)
或者
if (p) // 容易让人误解p 是布尔变量
if (!p)

...全文
362 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
howlet2 2009-12-30
  • 打赏
  • 举报
回复
学习
鄙人姓胡 2009-12-30
  • 打赏
  • 举报
回复
顶~~~~~~~~~~~
bobo364 2009-12-30
  • 打赏
  • 举报
回复
wolffan3150 2009-12-30
  • 打赏
  • 举报
回复
sagegz 2009-12-30
  • 打赏
  • 举报
回复
按照公司规范来
Arnold9009 2009-12-30
  • 打赏
  • 举报
回复
起始项目内代码风格统一了就好。。。。。
东大坡居士 2009-12-30
  • 打赏
  • 举报
回复
JAVA中建议用camel式
jernymy 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pipihaoyun 的回复:]
不规范的程序看着太痛苦了,我师姐他们就是命名都看不懂,长记性了,绝对不学她
[/Quote]

是啊,有时候看程序真的还要猜一下了。
帅得不敢出门 2009-12-29
  • 打赏
  • 举报
回复
那个命名法 似乎很多人不推荐的
且有许多种 仁者见仁了
pipihaoyun 2009-12-29
  • 打赏
  • 举报
回复
不规范的程序看着太痛苦了,我师姐他们就是命名都看不懂,长记性了,绝对不学她
jeff_nie 2009-12-29
  • 打赏
  • 举报
回复
代码规范是一种习惯。
taodm 2009-11-17
  • 打赏
  • 举报
回复
看过《代码大全》第二版11.5的人飘过
jernymy 2009-11-17
  • 打赏
  • 举报
回复
不好意思,竟然没有对齐

关于编成规范-命名规则的浅谈

本命名取自“匈牙利”法,仅供参考。

数据类型的命名规则参考:
定义类型:
前缀 类型 类型描述 示例 占字节(Win32) 有效值 取值范围
b Boolena-布尔 1Bit的标志 bool bFlag 4 (TRUE/FALSE) (0x0 ~0x1)
/* typedef int bool */
-------------------------------------------------------------------------------------
by Byte 字节 无符号的8bit字节 unsigned char byValue; 1 0 ~255 (0x0 ~0xFF)
ch Char 字符 有符号的8bit字节 signed char chValue; 1 -128~127 (0x80~0x7F)
-------------------------------------------------------------------------------------
w 不带符号的Word字 无符号的16bit整数 unsigned short wValue; 2 0 ~65535 (0x0 ~0xFFFF)
sw 带符号的16位整形数 有符号的16bit整数 signed short swValue; 2 -32768~32767 (0x8000~0x7FFF)
-------------------------------------------------------------------------------------
dw 不带符号的doubleword字 无符号的32bit整数 unsigned int dwValue; 4 0 ~4294967295 (0x0 ~0xFFFFFFFF)
n 带符号的32位整形数 有符号的32bit整数 signed int nValue; 4 -2147483648~2147483647 (0x80000000~0x7FFFFFFF)
-------------------------------------------------------------------------------------
f 单精度浮点数 单精度浮点数 float fValue; 4
d 双精度浮点数 双精度浮点数 double dValue; 8
-------------------------------------------------------------------------------------
p 指针(pointer) 指针 char *pchName; 4
pc const指针(pointer) const指针 const char *pcchName; /
/* unsigned char *pbyData; / unsigned short *pwData; */
/* const int *pcnData; / unsigned int *pdwData; */
-------------------------------------------------------------------------------------
t typedef自定义类型 struct结构体等类型 TNameInfo tName; /
pt 自定义类型指针 struct结构体指针等 PTNameInfo *ptName; /
-------------------------------------------------------------------------------------
a Array数组 数组 char achName[20]; /
aa 二位Array数组 多位数组 unsigned char aabyName[4][2]; /
-------------------------------------------------------------------------------------
ap 存放指针的数组 存放指针的数组 char *apchName[2]; /
pa 指向数组的指针 指向数组的指针 unsigned char *pabyName; /
-------------------------------------------------------------------------------------
em enum枚举类型 枚举类型 EM_NAME emName; 4
c class类 class类 CName cName; /
-------------------------------------------------------------------------------------
pf 函数指针(pointer func) 函数指针 typedef int (*pfMsgFunc)(int type);
-------------------------------------------------------------------------------------
s_ 静态变量(static) 静态变量 static int s_nValue;
g_ 全局变量(global) 全局变量 int g_nValue;
m_ 类的数据成员(member) 类的数据成员 int m_nValue;


函数名的命名规则参考:

1. 函数名的首字母建议大写,函数名采用大小写字母结合的形式
int GetMaxValue(void)
{
do someting;
}

2. 定义函数时,若函数无返回值,请冠以void 函数名格式;若函数无参数,请在参数中写入void格式;
void InitData(void)
{
do someting;
}

1. 全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)。
DrawBox(void); // 全局函数

2. 用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。
void SetValue(int nValue)
{
g_nValue = nValue;
}

int GetValue(void)
{
return g_nValue;
}

3. 回调函数最好出现“CB”字符;
typedef int (*pfTimerCB)(int type);
CreateTimer(g_TaskTimer, TaskTimerCB, NULL);

3. 在同一软件产品内,避免重名的函数出现
我们在不同的文件中都可以通过定义同样的函数
模块A
static void InitData(void); // 最好改成 static void InitAData(void);
模块B
static void InitData(void); // 最好改成 static void InitBData(void);

4. 函数名的长度最好小于30字符内。可以使用缩略词语,但是要有必要的全词注释。
tSysPara *GetSysPara(void) // tSystemPara *GetSystemParameter(void)

5. 一个函数代码最好控制在100行以内,一个模块文件,代码最好控制在1000行以内。

6. 最后,还有一点小小的建议,就是无论我们使用那种工具编写代码,VC6.0,SourceInsignt,UltraEdit,等
请按照格式排板,对齐,并将tab转换成4个空格,这样便于察看,修改等。


代码示例:与零值比较(摘自林锐博士-高质量C++/C 编程指南)

1. 布尔变量与零值比较
不可将布尔变量直接与TRUE、FALSE 或者1、0 进行比较。
根据布尔类型的语义,零值为“假”(记为FALSE),任何非零值都是“真”(记为TRUE)。TRUE 的值究竟是什么并没有统一的标准。例如Visual C++ 将TRUE 定义为1,而Visual Basic 则将TRUE 定义为-1。
假设布尔变量名字为flag,它与零值比较的标准if 语句如下:
if (flag) // 表示flag 为真
if (!flag) // 表示flag 为假
其它的用法都属于不良风格,例如:
if (TRUE == flag)
if (1 == flag)
if (FALSE == flag)
if (0 == flag)

2. 整型变量与零值比较
应当将整型变量用“==”或“!=”直接与0 比较。
假设整型变量的名字为value,它与零值比较的标准if 语句如下:
if (0 == value)
if (0 != value)
不可模仿布尔变量的风格而写成
if (value) // 会让人误解 value 是布尔变量
if (!value)

3. 浮点变量与零值比较
不可将浮点变量用“==”或“!=”与任何数字比较。
千万要留意,无论是float 还是double 类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。
假设浮点变量的名字为x,应当将
if (0.0 == x) // 隐含错误的比较
转化为
if ((x>=-EPSINON) && (x<=EPSINON))
其中EPSINON 是允许的误差(即精度)。
C++
const float EPSINON = 0.00001;
C
#define EPSINON (float)0.00001

4. 指针变量与零值比较
应当将指针变量用“==”或“!=”与NULL 比较。
指针变量的零值是“空”(记为NULL)。尽管NULL 的值与0 相同,但是两者意义不同。假设指针变量的名字为p,它与零值比较的标准if 语句如下:
if (NULL == p) // p 与NULL 显式比较,强调p 是指针变量
if (NULL != p)
不要写成
if (0 == p) // 容易让人误解p 是整型变量
if (0 != p)
或者
if (p) // 容易让人误解p 是布尔变量
if (!p)
jackyjkchen 2009-11-17
  • 打赏
  • 举报
回复
变量命名法很多,匈牙利是其中一种,微软所提倡的。

函数的这种命名法较骆驼规则,是Windows API的明敏规则,UNIX是全小写+下划线的规则。

条件比较最好找个能报警告的编译器(带代码分析的VS2008,或者gcc用-wall),然后用正常顺序。

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧