一键编译+执行c语言小Demo-创新互联

文章目录
      • 方法一
      • 方法二
      • 方法三
      • 方法四

站在用户的角度思考问题,与客户深入沟通,找到连云港网站设计与连云港网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站建设、成都做网站、企业官网、英文网站、手机端网站、网站推广、域名申请雅安服务器托管、企业邮箱。业务覆盖连云港地区。方法一

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

c

#!/bin/bash

path=`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" == "++" ];then
	c="g++";	file=`ls ${path}/*.cpp`;	shift
else
	c="gcc";	file=`ls ${path}/*.c` ;fi

main(){find_source_file
	build $*
}

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 ;fi
	if [ ! -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, "}")
      endif
      if &filetype == 'c'
    	...
      endif
方法三

可以在vim里面添加一个函数,也就是一键执行编译,这里网上一把大就不说了

方法四

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

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧

本文名称:一键编译+执行c语言小Demo-创新互联
URL网址:https://www.cdcxhl.com/article48/dphihp.html

成都网站建设公司_创新互联,为您提供微信小程序标签优化网页设计公司建站公司网站导航企业网站制作

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

搜索引擎优化