extern与include的差别
都可以引入函数,但是extern呢,引入范围更小,只需要把自己需要的函数引进来。而include会把整个头文件的函数引进来
main.c中引入其他函数,一定要include或者extern引用进来吗?
毁三观!不需要!!直接写就行了。只会给你类似下面一个警告,说你在搞隐式调用,程序一样可以跑的!!只要你在任何一个c函数有实现就可以了。
implicit declaration of function 'tcpecho_init_'; did you mean 'tcpip_init'?
static作用是什么?
1.静态变量,随着程序毁灭才毁灭
2.只在本文件有效,其他文件不能调用。同样可以修饰函数,修饰函数时,函数不能被外部调用。
如何根据一个地址取取地址里面的值呢?
int result =*(int *)addr;
原理就是,先通过(int )把addr先变成一个int指针,然后通过把地址中存的值取出来。
C语言单引号和双引号的区别
单引号代表字符,双引号代表字符串。
如果 char test = "A";结果会怎样呢?
结果就是把字符串A的地址,阶段后赋值给test。所以是不可预测的。
怎么定义函数宏?
#define COUNTOF(data) sizeof(data)/sizeof(*data)
#define DOSOMETHING() HAL_UART_Transmit(&huart1, (uint8_t *)"abc", 3,0xFFFF);
可以在头文件中定义变量吗?
不可以,以为这个头文件可能被多次include,导致变量重复定义。
参考:https://blog.csdn.net/baidu_35679960/article/details/79200865
extern "C" 有什么用
用来把一个函数用C的方式编译。C++和C的编译出来的符号是不一样的。因为C++支持函数的重载。
主要来用在头文件函数声明前进行修饰。
在C++调用C库的就用extern "C"了,不然符号就对不上了。
但是我发现很多C++的库也有extern "C"了,这个是否有问题呢?其实应该也没啥问题,只需要保持实现方和调用方都用同一个符号就行了。
为了保持库的头文件一致。我们常常能看到头文件里面会加入这样的宏判断。
ifdef __cplusplus
extern "C" {
endif
int add(int a, int b);
ifdef __cplusplus
}
endif
这就能实现C库能被C++调用,并且头文件是同一个,而不用单独起一个头文件让外部C++库使用。
网友评论