(整理去年学习的资料,语言是说话的方式,可能我会在不同的时期爱上C语言吧)
一、cpp 预编译处理的学习
inline
static
__attribute__
对于声明为内联的函数,会强制优化。所有加了attribute((always_inline))的函数再被调用时不会被编译成函数调用而是直接扩展到调用函数体内。
二、写代码注意事项:
1、命名清晰
2、malloc/free尽量用自己定义的方法,且在另外一个文件里。(以便自构方法去测试是否溢出)
3、方法定义在头文件必须用static inline方法 最好直接return
4、全局用 g_modulename_ unsigned long
5、条件编译。不需要定义的函数和变量不用定义
6、malloc使用时候是动态数组(不知len)或者长度超过函数栈空间大小才去定义
7、函数传参带有数组时需要加数组大小(宏定义只在定义数组和判断最大值的时候使用)
8、用fwrite替代fpirntf
9、函数对齐:参数过多,除第一外,每个对应左括号后
10、goto少用 结构尽量清晰
11、用结构体替代单一的strcmp操作
12、初始化不需要赋值
13、static只定义在函数内的
14、
struct *_s
int g_*
typedef *_s {} *_t
15、头文件定义顺序: 库文件在前自定义在后
16、C_INCLUDE_PATH、CPLUS_INCLUDE_PATH以及CPATH常被用于在全局性地添加预处理C/C++时的包含目录,
17、 头文件保护
方式一:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 一些声明语句
#endif
方式二:
#pragma once
... ... // 一些声明语句
#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。
#pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的"同一个文件"是指物理上的一个文件,而不是指内容相同的两个文件。
18、extern “C” :告诉编译器这部分用c语言
19、全局变量不能定义在头文件内 不然编译生成会有多份
20、数组最后一个 use NULL as array EOF
21、memset array error
char* str_p;
str_p = (char*)malloc(NUM);//临时申请地址
sizeof(str_p) == sizeof(pointer) == 8
sizeof(*str_p) == sizeof(char) == 1
char str[64];
sizeof(str) == 64 //在编译阶段就分配好
22、二维数组int arr[][]定义
法一:
不能直接用 int **arr_pr访问【ps:不知列数】
可用int(*p)[]访问
法二:
struct{
int arr[][];
};
23、尝试用obj的方式去编写c的通用方法(struct typedef)
三、其他的学习
1、线程保护
第三方库
1、cjson
cJSON_Print(const cJSON *item) 和 cJSON_PrintUnformatted(const cJSON *item) 这两个函数会调用 malloc 分配内存,需要调用 cJSON_free(void *object) 进行释放。
2.cgi
CGI的格式输出内容必须组织成标题/内容的形式。CGI标准规定了CGI程序可以使用的三个HTTP标题。标题必须占据第一行输出!而且必须随后带有一个空行
对编译出来的二进制CGI文件加s权限,并拷贝到Apache的CGI执行目录
chmod +s your_program.cgi