c笔记 (1)

时间:2021-02-14 01:24:55

1.static修饰全局变量

在一个源文件中引用另一个源文件中已经定义的全局变量需要用extern 声明。

但是如果是static 修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是 extern 外部声明也不可以!

linux中的函数和变量都是static

inux内核十分宠大,代码量超过百万行。对于C语言的函数和全局变量的作用空间都是全局的,但是是限制在本文件中,在另外一个文件中想使用的话,就要使用extern关键字,实现对于其他文件中的全局变量和函数的访问。
但是,一旦源码中函数名称定义相同,就会出现编译出错。因此,需要引入一些封装的特性,限制源码中函数和变量作用的空间。
这时候就用到了static关键字,在函数和变量前面添加static关键字,其作用范围将缩小到仅仅为当前的文件,而不是整个系统,因为其他的文件无法使用了,使用extern也无法使用,保证了绝对的安全。
因此在平时写驱动时,在前面添加static关键字是一个很好的习惯。

2.字符串 前 L的含义

L告示编译器使用两个字节的 unicode 字符集。宽字符占位可根据编译设置,和文本编码关联 2字节或4字节。
用两个字节来表示一个字符。
如 L"我的字符串" 表示将ANSI字符串转换成unicode的字符串,就是每个字符占用两个字节。
strlen(“asd”) = 3;
strlen(L"asd") = 6;

3.typedef

3.1uint32_t

C语言中有6种基本数据类型:short、int、long、float、double、char
这些数据类型中都带有_t, _t 表示这些数据类型是通过typedef定义的,而不是新的数据类型。也就是说,它们其实是我们已知的类型的别名。

typedef UINT16 fdt16_t;
typedef UINT32 fdt32_t;
typedef UINT64 fdt64_t;

https://blog.csdn.net/Mary19920410/article/details/71518130

3.2 typedef 对一个变量起多个别名

typedef 可以一次指定多个别名。

typedef int antelope, bagel, mushroom;
typedef UINT16 fdt16_t;
typedef UINT32 fdt32_t;
typedef UINT64 fdt64_t;

typedef UINT16 uint16_t;
typedef UINT32 uint32_t;
typedef UINT64 uint64_t;

上面示例中,一次性为int类型起了三个别名。
这样的好处是增强代码的可读性。

参考这篇文章,这个网站不错:
https://wangdoc.com/clang/typedef

另外也可以便于后期维护,比如
typedef int a;
用a定义了很多变量,但是我想改成double,那么我们直接修改typedef就可以了
typedef double a;

很方便。用a定义的变量就都变成了double类型,不需要在代码中一个个找。

4. 一维数组的地址是连续的

其实并不准确,应该说对于程序员连续

5. extern “C++”

我们知道在c++中编译c代码,用

extern "C" {
...
} 

但是在c 中也可以使用
例1

extern "C++" {
...
}

例2

#if defined(__cplusplus)
extern "C++" char* basename(char* __path) __RENAME(__gnu_basename) __INTRODUCED_IN(23);
extern "C++" const char* basename(const char* __path) __RENAME(__gnu_basename) __INTRODUCED_IN(23);
#else
char* basename(const char* __path) __RENAME(__gnu_basename) __INTRODUCED_IN(23);
#endif

https://*.com/questions/610934/why-would-you-use-extern-c

6. #include_next 与#include

#include_next是GNU的一个扩展,并不是标准C中的指令,
#include_next和#include指令一样,也是包含一个头文件,它们的不同地方是包含的路径不一样。
#include_next的意思就是“包含指定的这个文件所在的路径的后面路径的那个文件”

https://blog.csdn.net/fjb2080/article/details/5247494