我已经编写了一个包含许多函数的.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);
会更好。
答案 0 :(得分:4)
我认为你倒退了。宣言是这里的关键部分。实施是细节。你试图节省一些打字而不用仔细设计和制作界面,这在任何语言中都非常重要,但在C ++中它是 的东西。
从头文件开始。然后,如果您愿意,生成存根实现主体和测试用例包装器,然后开始填写函数。构建,测试,修复,扩展,皮革,重复。
不适合评论的咆哮:
我的问题是 - 如果它不是“公共界面”,为什么你需要它在标题中?我强烈认为,头文件包含的所有内容都是接口,无论内部和外部子系统有多小以及将其暴露给其他部分。对于一个人项目来说,这似乎并不重要。但迟早第二双眼睛(可能是你自己的,三四个月后)将不得不再次通过该界面,弄清楚为什么它被公开,作者在想什么,目的是什么等等。
琐?是!但是我不能告诉你有多少次我诅咒原作者(包括我自己)一些我必须阅读和理解的代码(再次),而这个琐碎的经验法则会为我节省这么多头发:)
...如何在标题中声明私有成员函数而不将其与类的其余部分一起声明?
这是C ++本身的失败。例如,请参阅Sutter的(Mostly) Private文章。在设计层面有几种方法可以解决这个问题:
答案 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
标记。