标记待实现功能

有时为了快速的把代码的架子搭起来,并编译通过。会把一些负责具体实现细节的方法先空置。整个代码能编译通过后,再一边调试一边把那些空方法“填”好。

我一般是在这类空方法中加一个注释进行标注, 并让方法直接返回一个错误值。比如返回指针的方法就让它返回NULL,返回BOOL值的方法就让它返回false。有时还会在方法里放一个失败的断言,比如:

BOOL some_function()
{
   //PK Not implement yet
   assert(false);
   return FALSE;
}

这样如果实在忘了实现这个方法了,在调试时当代码运动到这里时就会触发断言。

最近在新版的《windows核心编程》的附录里看到一个超好的技巧,更好的解决了标注的问题。象上面我用的那两个方法,还不是很方便。注释法,需要自己记得不停去全局搜特定的注释,如果忘了搜,或是输入注释时敲错了单词,就容易漏掉。如果程序的逻辑没有运行到放置了断言的方法中,断言法也就不起作用了。

《windows核心编译》里提供的这个方法更好的解决了这些问题。它通过一个预处理指令(#pragma message)在编译时输出一行指定的信息,并且通过一个宏定义在指定的信息前输出这个指令所在的文件名和行号。这样我们就可以象操作编译错误时一样,在output窗口中双击那一行信息,自动定位到指令所在的行上。

下面就是这个宏的定义:

#define chSTR2(x)	#x
#define chSTR(x)	chSTR2(x)
#define chMSG(desc)     message(__FILE__"("chSTR(__LINE__)"):"#desc)

这个定义虽然简单但很精巧,__FILE__和__LINE__是两个预处理器定义的宏,值分别为当前的文件名和行号。#将它后面的的宏变量求值并字符串化。

建议直接把这三行COPY到stdafx.h头文件中,这样在工程的所有地方都可以引用。

利用这个宏,我们只需要在代码里需要标注的地方输入如下的行,注意括号内的内容不需要用引用括住,因为我们用了#进行字符串化。

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

双击就可以跳到相应的代码行。

我在这个基础上又加了一个宏:

#define NOT_IMPLEMENT_YET chMSG(not implement yet)

这样只需要以下行:

#pragma NOT_IMPLEMENT_YET

就可以做标记了。

用这种方式,还可以定义很多其他的标记。比如:对需要在以后进行优化的地方,我们可以定义以下的标记宏:

#define OPTIMIZATION chMSG(should be optimized)

由于#在预处理指令里有特殊功能,而预处理系统又不提供转义符。所以我没找到方法把#pragma也塞到宏定义里面去。如果可以放进去的话,会更简洁。哪位达人如果知道方法的话,请记得告诉我。

6 Comments

  1. duncan 说:

    good trick. 但GCC好像不支持 pragma。参考一下http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html#Diagnostic-Pragmas

  2. 阿凯 说:

    对GCC是不支持#pragma预编译指令。这个方法我也是VC下用的。

    不过的确是很好用。尤其是在用快速写业务逻辑的时候,可以建很多具体算法和步骤先写成空函数,里面放一个这个语句。可以快速的把框架搭起来,全部编译通过,再回过头来一个个补。不会打断思路。在开发团队中还可以每人定义一个宏,把自己的名字加进去。这样其他人编译的时候知道这个函数没实现要找谁,呵呵。

  3. Bill 说:

    这个宏确实不错,潘哥看书看的很细致嘛,连附录都不放过

  4. Bill 说:

    如果不想每次都打这么多字的话,可以把这句话加到VA宏里面去,那样也挺爽的

  5. 阿凯 说:

    to bill:
    想起来当时还是借你的书看的。汗呀。。。

  6. Bill 说:

    受打击了

Leave a Reply