根据函数定义生成函数声明

时间:2010-06-05 14:44:32

标签: c++ function header declaration definition

我已经编写了一个包含许多函数的.cpp文件,现在需要在头文件中声明它们。在我看来,我可以grep文件中的类名,并以这种方式获取声明,并且它也可以运行得很好,在定义之前有完整的函数声明 - 返回代码,名称和参数(但不是功能体) - 在一条线上。

在我看来,这通常是有用的,而且必须已经解决了很多次。我很乐意编辑输出而不担心边缘情况;任何给我95%正确结果的东西都会很棒。

因此,例如,如果我的.cpp文件有:

i2cstatus_t NXTI2CDevice::writeRegisters(
    uint8_t  start_register,    // start of the register range
    uint8_t  bytes_to_write,    // number of bytes to write
    uint8_t* buffer = 0)        // optional user-supplied buffer
{
...
}

和许多其他类似的功能,得到这个:

i2cstatus_t NXTI2CDevice::writeRegisters(
        uint8_t  start_register,    // start of the register range
        uint8_t  bytes_to_write,    // number of bytes to write
        uint8_t* buffer = 0)

包含在头文件中,经过一点编辑后,就可以了。

取回来:

i2cstatus_t writeRegisters(
        uint8_t  start_register,    
        uint8_t  bytes_to_write,    
        uint8_t* buffer);

或者这个:

i2cstatus_t writeRegisters(uint8_t  start_register, uint8_t  bytes_to_write, uint8_t* buffer);

会更好。

2 个答案:

答案 0 :(得分:4)

我认为你倒退了。宣言是这里的关键部分。实施是细节。你试图节省一些打字而不用仔细设计和制作界面,这在任何语言中都非常重要,但在C ++中它是 的东西。

从头文件开始。然后,如果您愿意,生成存根实现主体和测试用例包装器,然后开始填写函数。构建,测试,修复,扩展,皮革,重复。

编辑:

不适合评论的咆哮:

我的问题是 - 如果它不是“公共界面”,为什么你需要它在标题中?我强烈认为,头文件包含的所有内容都是接口,无论内部和外部子系统有多小以及将其暴露给其他部分。对于一个人项目来说,这似乎并不重要。但迟早第二双眼睛(可能是你自己的,三四个月后)将不得不再次通过该界面,弄清楚为什么它被公开,作者在想什么,目的是什么等等。

琐?是!但是我不能告诉你有多少次我诅咒原作者(包括我自己)一些我必须阅读和理解的代码(再次),而这个琐碎的经验法则会为我节省这么多头发:)

编辑2:

...如何在标题中声明私有成员函数而不将其与类的其余部分一起声明?

这是C ++本身的失败。例如,请参阅Sutter的(Mostly) Private文章。在设计层面有几种方法可以解决这个问题:

  • 在C ++中,不是所有东西都必须是一个类,自由函数是伟大的。声明并使用函数指针,在.cpp文件中实现一堆匹配函数,将指针放入表或STL容器中。
  • 转发声明一个类,因此它是 opaque 给用户,修改接口以对引用或指针进行操作。
  • 使用pimpl成语(也是here

答案 1 :(得分:1)

我编译了exuberant ctags版本5.8。这个命令让我得到了我想要的东西:

/usr/local/bin/ctags -x --c-kinds=f $SOURCE |
awk -v OFS=" " '$1=$1' |
cut -d " " -f 5- |
sed -e 's/[A-Za-z]*:://g' |
sed -e 's/)$/);/'

您可以用您感兴趣的文件名替换$ SOURCE。

请注意,ctags命令本身会提供合理的输出,如果您希望输出按照文件中出现的顺序而不是按字母顺序排列,则可以输入-u标记。