如何在linux中仅使用一个命令编译和运行cpp文件?

Spa*_*nST 5 linux command-line

最近我开始在linux上学习cpp语言,现在我使用以下命令运行一个cpp文件。

g++ -o xxx xxx.cpp
./xxx
Run Code Online (Sandbox Code Playgroud)

有没有办法让它成为单行命令,例如compile-and-run xxx.cpp?谢谢。

Apa*_*che 6

那这个呢?
g++ -o xxx xxx.cpp && ./xxx?
&&意味着它会等到第一个任务完成,&意味着它会在它开始第一个任务后立即启动它,你不想要这个。)


Bob*_*bby 6

杰里米·班克斯 (Jeremy Banks) 发布我在 SO 上看到的最棒的技巧之一。基本上,他在 cpp 文件的顶部添加了一个Bash-Script 行,这允许他直接编译和执行该文件。

//&>/dev/null;x="${0%.*}";[ ! "$x" -ot "$0" ]||(rm -f "$x";cc -o "$x" "$0")&&exec "$x" "$@"
Run Code Online (Sandbox Code Playgroud)

这个解释是从要点复制而来的:

//
Run Code Online (Sandbox Code Playgroud)

由于我们不希望它在 C 中可见,因此我们将其放在注释中。

&>/dev/null
Run Code Online (Sandbox Code Playgroud)

不幸的//是,它被解释为无效的 shell 命令并产生错误消息,因此我们需要将其重定向到/dev/null 以摆脱它。

;x="${0%.*}"
Run Code Online (Sandbox Code Playgroud)

这通过使用字符串替换来删除当前文件名上的任何扩展名来确定我们编译的文件名。

;[ ! "$x" -ot "$0" ]||
Run Code Online (Sandbox Code Playgroud)

此检查是否已经存在比源文件更新的编译版本。如果不...

(rm -f "$x";cc -o "$x" "$0")
Run Code Online (Sandbox Code Playgroud)

...我们删除任何现有版本,然后使用我们选择的编译文件名编译我们的代码。

&&exec "$x" "$@"
Run Code Online (Sandbox Code Playgroud)

如果编译成功或不必要,则将执行传递给已编译的代码,传递给此脚本的参数。

这种技术称为Polyglot,这意味着它是用多种语言编写的,也可以由那些语言解释器毫无问题地进行解释。