小侄子把他的代码发来股票杠杆公司,让我帮他看一下为什么老是编译不过去.
我点开他的main.c,先粗略的扫了一遍,我的习惯总是先看一下代码风格,不说写的”多优美”,最起码让人一看感觉不”烦躁”,不”毛躁”,然后我才会看一看逻辑可有问题.
可是我一眼瞅上去,总觉得哪里怪怪的,整体代码风格,在我前几次的”严肃批评”中,已经引起了他的足够重视,慢慢习惯后,有了不错的变化,可我还是觉得哪里怪怪的......
突然间找反应过来了,是头文件!
头文件(部分)
我把头文件部分截图甩给他.什么也没说.
一会他回过来了,说:我叔,我看到你发的截图,仔细看了一遍,头文件没问题啊.用到的标准库函数,所有对应的头文件我都包含了,还有几个是我自己写的功能模块的头文件调用,没问题啊.
我看他一头雾水,是真没明白.只好说到:你的代码逻辑我还没看,不是因为头文件的问题造成的bug.为什么你所有的头文件都是用双引号包起来的?
他说:噢,你说这个啊!是这样的,当我输入#include时,CLion(IDE)自动打出双引号,我就直接输入头文件名了,这样很方便.我知道你是不是要说尖括号和双引号的区别?

我知道尖括号是直接在系统路径下搜索头文件,双引号是在当前项目路径下搜索头文件.搜索不倒就自动去标准路径下再搜索,不过,即便这样,也不损耗性能吧,毕竟只是在编译前预处理下.
我说:倒不是说增加什么编译时长,对了,你还记得我和你说过的吗?咱们写代码是给谁看的?
他说:你不是总说,代码是给人看的,不是给机器看的嘛.
我说:是的,第一顺位是给人看的,第二顺位才是考虑机器执行的性能.那么可读性既然这么重要,你这个写法就违反了”可读性”.就是尖括号和双引号.
他说:尖括号和双引号怎么就违反了可读性?
我说:从正确性来说,你当然都可以用双引号,而且很方便.最起码你在导入库函数时,不用回退一下,删除双引号,再打一个尖括号吧.
他说:是的啊,别看很小的一个细节,但能提高不少效率呢.....
我继续说到:是的,是很小的一个细节,看起来就是尖括号和双引号的小事,但是,当后面的人读你的代码时候,一眼捎过去,我看到尖括号就知道你导入了库函数,看到双引号就知道你自定义了一些函数,放在了这些头文件里.就会很容易的区分出来.特别是以后你做项目的时候,用开发框架,比如Qt,都几十个,上百个头文件(系统的、自定义的等等),你都混在一起,看的时候会很痛苦的,很难一眼识别出来。
你不是问过我,什么是程序员的35岁危机?真有什么35岁危机吗?
我明确的告诉你,有,也没有。软件开发的能力,与你从业的时间长短,真的没有太大的关系。如果不学习,不进步,8年开发经验,也只是脚本小子、调库仔、CRUD boy、框架奴隶。。。。。。
特别是在新手阶段,更要注意细节,只有这样,把严谨和规范刻在你的骨子里,你才会真正的从新手变成高手,才会成为一个真正的软件工程师,或者算法工程师,甚至是“计算机科学家”!
对了,你想过没有?你的每一个自定义的.h文件都有一个配套的.c或者.cpp文件,你每次是不是都加在cmakelist.txt里?
cmakelist.txt里的内容
他说:肯定啊,不添加或者注释掉编译时就会报错了.
我说:你信不信,我不添加一样能编译通过.
他说:……
我说:你只要把你main.c包含的自定义头文件.h的后缀改为.c就可以了.注意,记得把cmakelist.txt里添加的.c文件用#注释掉啊.
他编译,测试,通过.
我继续说道:你也用过visual studio,你注意过没有,在vs里没有cmakelist.txt,在头文件目录里添加头文件,在源文件目录里添加对应的实现文件,然后在主程序里包含头文件就可以了,你注意没有?
他”噢”一声,说道:你不说,我没注意过这些细节,是的,VS里是直接包含.h文件,.c文件只要写好就可以了,不用管的,不像CLion里要添加到cmakelist.txt里.
vs的目录结构
我说:其实原因都很简单,VS里不是没有,只是在编译时,强大的MSVC自己替你做了,如果你习惯了用makefile方式,他也提供了cmake模式,不过还不如直接用clion了。
不过有个很重要的点药和你说,就是我后面演示的,在main.c里include 实现文件,而不是头文件,是严重错误的!我只是为了说明include的本质就是包含,但实际开发中,坚决不能这样用!
主程序里只能include头文件,不要暴露实现细节,这是工程规范,要牢记,今天的信息量已经够多的了,到现在bug还没来的及帮你看呢!......
下次再细说股票杠杆公司,先帮你找找BUG吧......