标记待实现功能
2009年08月7日, 12:10 下午
1,088 views
有时为了快速的把代码的架子搭起来,并编译通过。会把一些负责具体实现细节的方法先空置。整个代码能编译通过后,再一边调试一边把那些空方法“填”好。
我一般是在这类空方法中加一个注释进行标注, 并让方法直接返回一个错误值。比如返回指针的方法就让它返回NULL,返回BOOL值的方法就让它返回false。有时还会在方法里放一个失败的断言,比如:
view plaincopy to clipboardprint?
BOOL some_function()
{
//PK Not implement yet
assert(false);
return FALSE;
}
BOOL some_function()
{
//PK Not implement yet
assert(false);
return FALSE;
}
这样如果实在忘了实现这个方法了,在调试时当代码运动到这里时就会触发断言。
最近在新版的《windows核心编程》的附录里看到一个超好的技巧,更好的解决了标注的问题。象上面我用的那两个方法,还不是很方便。注释法,需要自己记得不停去全局搜特定的注释,如果忘了搜,或是输入注释时敲错了单词,就容易漏掉。如果程序的逻辑没有运行到放置了断言的方法中,断言法也就不起作用了。
《windows核心编译》里提供的这个方法更好的解决了这些问题。它通过一个预处理指令(#pragma message)在编译时输出一行指定的信息,并且通过一个宏定义在指定的信息前输出这个指令所在的文件名和行号。这样我们就可以象操作编译错误时一样,在output窗口中双击那一行信息,自动定位到指令所在的行上。
下面就是这个宏的定义:
view plaincopy to clipboardprint?
#define chSTR2(x)
#x
#define chSTR(x)
chSTR2(x)
#define chMSG(desc)
message(__FILE__"("chSTR(__LINE__)"):"#desc)
#define chSTR2(x)
#x
#define chSTR(x)
chSTR2(x)
#define chMSG(desc)
message(__FILE__"("chSTR(__LINE__)"):"#desc)
这个定义虽然简单但很精巧,__FILE__和__LINE__是两个预处理器定义的宏,值分别为当前的文件名和行号。#将它后面的的宏变量求值并字符串化。
建议直接把这三行COPY到stdafx.h头文件中,这样在工程的所有地方都可以引用。
利用这个宏,我们只需要在代码里需要标注的地方输入如下的行,注意括号内的内容不需要用引用括住,因为我们用了#进行字符串化。
view plaincopy to clipboardprint?
BOOL some_function()
{
#pragma chMSG(not implement yet)
return FALSE;
}
BOOL some_function()
{
#pragma chMSG(not implement yet)
return FALSE;
}
编译时会在output窗口中产生类似下面的输出:
1>d:\my_project\trunk\aural_superman\write_component_collection.cpp(86):not implement yet
双击就可以跳到相应的代码行。
我在这个基础上又加了一个宏:
view plaincopy to clipboardprint?
#define NOT_IMPLEMENT_YET chMSG(not implement yet)
#define NOT_IMPLEMENT_YET chMSG(not implement yet)
这样只需要以下行:
view plaincopy to clipboardprint?
#pragma NOT_IMPLEMENT_YET
#pragma NOT_IMPLEMENT_YET
就可以做标记了。
用这种方式,还可以定义很多其他的标记。比如:对需要在以后进行优化的地方,我们可以定义以下的标记宏:
view plaincopy to clipboardprint?
#define OPTIMIZATION chMSG(should be optimized)
#define OPTIMIZATION chMSG(should be optimized)
由于#在预处理指令里有特殊功能,而预处理系统又不提供转义符。所以我没找到方法把#pragma也塞到宏定义里面去。如果可以放进去的话,会更简洁。哪位达人如果知道方法的话,请记得告诉我。