一键编译+执行c语言小Demo
创始人
2024-02-18 07:24:08
0

方法一

因为会经常写c的小demo所以也就用不上项目工程编译工具make那么导致我每次修改为代码就需要gcc demo.c -g -o demo 操作,然后就想着用shell进行自动化执行,然后雏型就出来了

c

#!/bin/bashpath=`pwd`
source_file=`ls ${path}/*.c`
gcc $source_file -o ${source_file%.*} -g
${source_file%.*}

编写如上内容,然后命名为c再放入到/usr/local/bin目录下并给它可执行权限chmod +x c,就可以在任意目录执行了

这里就是简单的获取需要执行编译脚本的路径,然后进行一个编译+运行操作

$ ls;cat demo.c                                                 [~/tmp]
demo.c
#includeint main(){printf("hi\n");return 0;
}

然后执行c那么就可以直接看到结果了

$ c                                                             [~/tmp]
hi
$ ls                                                            [~/tmp]
demo*      demo.c     demo.dSYM/

很显然这只是一个简单的功能实现雏型,为了将它工具化就需要对不同的使用场景和使用功能考虑,上述的问题有:

  1. 当源代码的路径时存在一个目录和源代码同名字时
  2. 当源代码的路径存在多个.c文件时
  3. 当源代码是c++
  4. 当编译需要多个参数时

然后完善上面的问题后的脚本为

#!/bin/bash
path=`pwd`
build_type="$1"if [ "$build_type" == "++" ];thenc="g++";	file=`ls ${path}/*.cpp`;	shift
elsec="gcc";	file=`ls ${path}/*.c` ;fimain(){find_source_filebuild $*
}find_source_file(){source_file=$(echo $file | awk '{print $1}')multi_file=$(echo $file | awk '{print $2}')if [ -z "$source_file" ];then	echo -e "\033[31mCouldn't find format $c source file\033[0m";exit ;fiif [ ! -z "$multi_file" ];then	echo -e "\033[31mMultiple files checked~\033[0m";	echo -e "\033[31mThe $source_file file will be used\033[0m" ;fi
}build(){$c $source_file -o ${source_file%.*} -g $*${source_file%.*}
}main $*

那么就来玩玩。c\cpp源代码如下:

$ cat demo.c demo.cpp                                                                                                               [/t/d/demo]
#includeint main(){printf("c\n");return 0;
}
#includeint main(){printf("cpp!\n");return 0;
}

测试

$ ls                                                                                                                                [/t/d/demo]
demo.c     demo.cpp   demo.dSYM/
$ c                                                                                                                                 [/t/d/demo]
c
$ c ++                                                                                                                              [/t/d/demo]
cpp!

当前目录存在多个源代码时

$ ls                                                                                                                                [/t/d/demo]
demo*       demo.c      demo.cpp    demo.dSYM/  democc.c    democc.cpp
$ c                                                                                                                                 [/t/d/demo]
Multiple files checked~
The /tmp/demo/demo/demo.c file will be used
c
$ c ++                                                                                                                              [/t/d/demo]
Multiple files checked~
The /tmp/demo/demo/demo.cpp file will be used
cpp!

为了方便大家搭建使用,可以执行下面代码一键搭建完成

echo "IyEvYmluL2Jhc2gKcGF0aD1gcHdkYApidWlsZF90eXBlPSIkMSIKCmlmIFsgIiRidWlsZF90eXBlIiA9PSAiKysiIF07dGhlbgoJYz0iZysrIjsJZmlsZT1gbHMgJHtwYXRofS8qLmNwcGA7CXNoaWZ0CmVsc2UKCWM9ImdjYyI7CWZpbGU9YGxzICR7cGF0aH0vKi5jYCA7ZmkKCm1haW4oKXsKCWZpbmRfc291cmNlX2ZpbGUKCWJ1aWxkICQqCn0KCmZpbmRfc291cmNlX2ZpbGUoKXsKCXNvdXJjZV9maWxlPSQoZWNobyAkZmlsZSB8IGF3ayAne3ByaW50ICQxfScpCgltdWx0aV9maWxlPSQoZWNobyAkZmlsZSB8IGF3ayAne3ByaW50ICQyfScpCglpZiBbIC16ICIkc291cmNlX2ZpbGUiIF07dGhlbgllY2hvIC1lICJcMDMzWzMxbUNvdWxkbid0IGZpbmQgZm9ybWF0ICRjIHNvdXJjZSBmaWxlXDAzM1swbSI7ZXhpdCA7ZmkKCWlmIFsgISAteiAiJG11bHRpX2ZpbGUiIF07dGhlbgllY2hvIC1lICJcMDMzWzMxbU11bHRpcGxlIGZpbGVzIGNoZWNrZWR+XDAzM1swbSI7CWVjaG8gLWUgIlwwMzNbMzFtVGhlICRzb3VyY2VfZmlsZSBmaWxlIHdpbGwgYmUgdXNlZFwwMzNbMG0iIDtmaQp9CgpidWlsZCgpewoJJGMgJHNvdXJjZV9maWxlIC1vICR7c291cmNlX2ZpbGUlLip9IC1nICQqCgkke3NvdXJjZV9maWxlJS4qfQp9CgptYWluICQqCg==" | base64 -d > /usr/local/bin/c && chmod a+x /usr/local/bin/c

方法二

后来我看到了这篇文章https://zhuanlan.zhihu.com/p/143231248 这种设计就是运用了我上面所说的没有指定Shebang字符头那么就会默认交给sh解释器执行,作者说了其实就是在c源代码里面执行shell语法进行编译自身,但同时不能被c编译器给发现错误

这里发现作者的代码有点小错误,只需要把"./$proName" 改成-> “$proName就可以了”

简单改写如下:demo.c

#if 0
pro=${0%.*} && gcc $0 -o $pro $@ && $pro && exit
#endif#includeint main(){printf("c\n");return 0;
}

首先你必须给demo.c执行权限然后直接执行./demo.c,因为没有指定Shebang字符头所以会默认将demp.c交给sh解释器执行语句,当sh解释器遇到#时会将它视为单行注释,然后会正常的执行编码命令。直到exit后退出执行

而因为#if #endif在c编译器里面也是一个合法的注视命令,所以c编译器会过滤掉文件头部一块,从而编译成功

这种方法也不错,但是需要每次都添加上述的一个头部shell代码,如果你是一个vim用户那么你可以直接在init.vim中添加上述的头部shell代码到你的c\c++模版中

	 if &filetype == 'cpp'call setline(1, "#if 0")call setline(2, "pro=${0%.*} && gcc $0 -o $pro $@ && $pro && exit")call setline(3, "#endif")call setline(4, "")call setline(5, "#include")call setline(6, "")call setline(7, "int main(){")call setline(8, "")call setline(9, "   printf(\"\\n\");")call setline(10, "   return 0;")call setline(11, "}")endifif &filetype == 'c'...endif

方法三

还有一种就是使用tcc,我不想额外的搭建环境,所以大家自行探索

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...