C语言编程的坑
好久没有写过C, 下面总结下一些坑, 填坑的过程不仅感慨js/python大法好啊!
enum与typedef enum
enum 定义类型后, 再定义变量前面还要把enum加上, 否则会报错
enum TTT{A, B, C};
enum TTT ttt; //不能写作 TTT ttt;
但这个很烦人不是么, typedef的作用就来了:
typedef enum _TTT{A, B, C}TTT;
TTT ttt; //再没有讨厌的enum了
enum定义的变量至少占1个int字节
注意上面enum定义的变量至少占1个int字节,最多占1个longlong字节, 具体是编译器根据enum中的最大值确定的. 在某些RAM捉襟见肘的MCU上(比如51上只有128字节), 1int = 2byte, 真的是大大的浪费. 这时候还不如用#define
大法...
#define A 0
#define B 1
#define C 2
全局变量在哪儿定义?在哪儿声明?
首先定义的方式是: int g = 0;
(必须初始化)
声明的方式是加extern
, 如: extern int g;
全局变量必须且只能在.c
中定义(且初始化), 必须且只能在.h
中声明. 当然如果其他.c文件不需要使用这个全局变量的话, 就不需要在.h中extern
它.
原因1: 全面变量在.h
中定义的话, .h
文件的相互引用一定会造成编译器报错重复定义. 而且似乎用#ifndef
大法也没有用;
原因2: 全局变量在.c
中声明的话, 如果不同的.c
文件都要使用的时候, 声明很可能重复且不一致,造成编译器报警.
#define
, enum
, typedef
, 函数在哪儿声明?
我感觉, 如果是要让其他C程序使用的, 就在.h
中声明, 否则, 就在本.c
文件前面声明, 虽然这样c文件前面会很啰嗦...
这样在.c
中声明的部分就像是private的, 在.h
中声明的部分就像是public的.