1. 前言

本来是想随意写一个简单的程序进行测试,结果一个报错让我怀疑人生。本文描述的报错原因,大家是绝对想不到的。请看我一一道来,纯粹自嘲吧。

2. 探索过程

就拿最熟悉的 Hello world 来演示,程序如下:

#include "stdio.h"

int main(int argc, char *argv[])
{
       printf("hello world!\n");
       return 0;
}

代码简单,可就是编译通过,运行出错,出错信息如下:

./func.c: line 3: syntax error near unexpected token `('
./func.c: line 3: `int main(int argc, char *argv[])'

尝试过程如下:

  1. 考虑到 Windows 和 Linux 下换行符的差异,直接在 Linux 下重新创建文件并使用 Vim 编写,无果;
  2. 考虑到报错信息提到 main 字样,仔细查看 main 附近代码,看是否有中文标点符号,无果;
  3. 考虑…知识储备和经验不够了…

但很多时候,在我怀疑人生而无果但依然坚持的情况下,能够让我突然窥探到我想要的答案,很是幸运。

3. 原因

在 Linux 下使用如下命令编译源文件后

gcc func.c

在控制台习惯性的输入 ./fu 并使用 Tab 键自动补全来运行程序,并且一气呵成

./func.c

结果就报出了以上错误;
其实编译后生成的可执行文件是 a.out,而我误以为编译生成了 func 可执行文件,就没想到自动补全后运行的是 func.c 源文件,而源文件没经过编译运行居然提示报错在 main 函数处。

4. 结语

首先我得吐槽一下:运行非执行文件,报错信息居然这么误导人。又算是栽到你手里了 – Linux

再次深刻的体会到了 习惯的力量,这力量是巨大的,巨大到你不会认为执行命令的语句是错误的,眼睛死死的盯着出错信息来进行判断。

本博文很大概率并不是大家想要的预期答案,甚至会认为这是在瞎扯。确实,对于不会面临该问题的人来说是瞎扯,但是因为个人习惯而面临的时候,也算是一种解决问题的思路。

一切没有解决的问题都是大问题,一切解决了的问题都是小问题。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐