在进行竞争性编程时,我将每个问题都放在一个包含测试和解决方案的自包含目录中,类似于以下内容:
problem_a/
tests/
default.in default.out
main.c
我还希望能够编译解决方案(总是单个文件)并通过输入输入文件并通过简单的命令行命令将结果与输出文件区分开来运行它。我通常使用类似于以下内容的东西:
make main && (./main < tests/default.in | diff tests/default.out - ; rm main)
现在我希望能够在同一目录中拥有多个(不同编程语言)解决方案。例如,要添加main.cpp
。但是,这与上述命令冲突,因为make
总是优先于CPP规则的默认C规则。
最实际的解决方案是使用额外的_c
和_cpp
描述符对文件名进行后缀吗?我的纯粹主义者认为这是多余的,希望有更好的方法,或许可以重新排序make
的默认规则?
答案 0 :(得分:0)
我最终为解决方案创建了一个目录,以便在运行make
时没有名称冲突:
problem_A/
solutions/
cpp/
main.cpp
ansi-c/
main.c
tests/
default.in
default.out
然后我编写了一个简单的脚本,以便能够一起构建和测试:
3 BINFILE=./solutions/$1/main
4 INFILE=./tests/$2.in
5 OUTFILE=./tests/$2.out
6
7 make $BINFILE && ($BINFILE < $INFILE | diff $OUTFILE - ; rm $BINFILE)
此脚本可以按如下方式运行:
cp-test ansi-c default
不是最优雅的解决方案,但它现在有效。任何其他建议都会很棒。