在当前目录中,所有C头文件(* .h)不包含预处理器宏
#ifndef FILENAME_H
#define FILENAME_H
...
#endif
,手动将它们添加到每个标题中太繁琐了。如何通过python或shell自动完成?
答案 0 :(得分:2)
根据Cody的回答,我实施了guardHeader.py:
1 #!/usr/bin/python3
2
3 import glob,os,sys
4
5 global search_dir
6
7 def clearContent(pfile):
8 pfile.seek(0)
9 pfile.truncate()
10
11 def guard(fileName):
12 file = open(fileName, 'r+')
13 content = file.read()
14
15 fileNameUp = fileName.split(".")[0].upper() + '_H'
16 guardBegin = '#ifndef ' + fileNameUp + '\n' \
17 '#define ' + fileNameUp + '\n\n'
18 guardEnd = '\n#endif'
19 newContent = guardBegin + content + guardEnd
20
21 clearContent(file)
22 file.write(newContent)
23
24 if __name__ == '__main__':
25 if len(sys.argv) == 1:
26 print('Please provide a directory')
27 else:
28 search_dir = sys.argv[1]
29
30 # enter search directory
31 os.chdir(search_dir)
32
33 for file in glob.glob("*.h"):
34 guard(file)
答案 1 :(得分:1)
假设您在unix
个shell中,find
,cut
和sed
可用。您可以使用find
获取每个文件名,然后使用sed
更改这些文件。
您可以将以下脚本保存在名为addifndef.sh
的文件中。
for fn in $(find . -maxdepth 1 -type f -regex '.*\.h$' | cut -f 2 -d '/');
do
dn=$(echo $fn | cut -f 1 -d '.');
sed -i -e "1 i#ifndef ${dn}_H\n#define ${dn}_H" -e "$ a#endif" "$fn";
done
然后,在shell提示符下将该脚本作为[prompt $] sh addifndef.sh
运行。
或者,您可以在命令行中直接使用此命令。
有关详细信息,您必须查看man pages
find
,cut
和sed
的{{1}}。
答案 2 :(得分:1)
我要去看第二张@ kaylum的建议而且也没有给你全部的东西,但这里有一些伪代码可能会让你走上正确的道路
for each file in the directory
if filename doesn't end with .h
continue
open the file
store its contents in a variable
create the header guard by taking the filename, removing the '.', and replacing it with a '_'
create new contents = headerGuard + contents + "\n#endif"
write file back out to the same name
这些内容中的每一项都应该通过快速谷歌/堆栈溢出搜索来回答,如果你无法找出任何这些部分,那么关于该位的特定堆栈溢出问题将更适合这个站点。 And here is one link to a relevant question to get you started.
答案 3 :(得分:0)
这是一个完成任务的小脚本:https://gist.github.com/rumpeltux/9e4a3e6e8ccd4c0c86770ca4f2afc1d0
wget https://gist.github.com/rumpeltux/9e4a3e6e8ccd4c0c86770ca4f2afc1d0/raw/auto_add_headers.sh
find -name \*.h | xargs sh auto_add_headers.sh