将命名空间声明添加到许多文件?

时间:2011-08-01 18:13:43

标签: c++ namespaces

假设我有很多c ++文件要添加名称空间声明。即我希望文件看起来像:

//pre-processor commands and other stuff not in the namespace
namespace foo
{
    //previously existing code
}
//EOF

无需手动打开每个文件,无论如何都可以这样做?到目前为止,我能够提出的最好的是一个emacs宏来对每个文件进行操作,但我仍然必须仔细检查每个文件。

1 个答案:

答案 0 :(得分:4)

#!/bin/bash
for f in *.h
do
  line=`grep -n '^#' $f | tail -1 | cut -f1 -d:`
  head -$line $f > tempfile
  echo 'namespace foo {' >> tempfile
  let line++
  tail --lines=+$line $f >> tempfile
  echo '} // end namespace foo' >> tempfile
  mv tempfile $f
done

这将遍历当前目录中的每个头文件,并且:

  • 找到最后一个预处理器行(也就是以'#'开头的行)
  • 将文件的第一部分转储到临时文件
  • 添加行以打开命名空间
  • 添加现有文件的其余部分
  • 添加行以关闭命名空间
  • 用临时文件替换文件

请注意,如果您想要点击cpp文件,那么第一行必须是for f in *.h *.cpp。但是,如果你的cpp文件有静态函数或匿名命名空间,那么这将不起作用。

请注意,这假设您的头文件没有使用经典的包含保护。它假定所有预处理器命令都在文件的顶部。如果情况并非如此,则必须进行一些调整。试试你的一些文件,根据需要进行调整,然后再尝试一些。