一、C语言可以在不同的源文件中定义相同名字的全局变量吗?
不使用static的时候,两个不同的源文件都可以正常编译,但会出现链接错误,原因是有两个地方存在相同的变量,导致编译器无法识别应该使用哪一个。
使用static的时候,你所定义的static变量,编译的时候编译器会将其重新命名,其他文件就不会使用到这个文件的static变量了,这样就使得只在本文件内有效。
二、C语言中 void *指针与空指针区别?
void* 这不叫空指针,这叫无确切类型指针.这个指针指向一块内存,却没有告诉程序该用何种方式来解释这片内存.所以这种类型的指针不能直接进行取内容的操作.必须先转成别的类型的指针才可以把内容解释出来.
还有' ',这也不是空指针所指的内容. ' '是表示一个字符串的结尾而已,并不是NULL的意思.
真正的空指针是说,这个指针没有指向一块有意义的内存,比如说:
char* k;
这里这个k就叫空指针.我们并未让它指向任意地点.
又或者
char* k = NULL;
这里这个k也叫空指针,因为它指向NULL 也就是0,注意是整数0,不是' '
一个空指针我们也无法对它进行取内容操作.
空指针只有在真正指向了一块有意义的内存后,我们才能对它取内容.也就是说要这样
k = "hello world!";
这时k就不是空指针了.
三、C语言中#与##意义?
## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的定义在编译原理里有详尽的解释,但不知道也无所谓。
#连接符是把传递过来的参数当成字符串进行替代。
四、最好不要在头文件中定义变量
为了防止多个C文件包含同一头文件而引起的变量重复定义错误,一般不要在头文件中定义变量。使用#ifndef...#define...#endif只是防止了同一C文件中头文件被重复包含(其实本例中只有一个头件,不会存在重复包含的问题),但是无法防止多个C文件包含同一头文件时变量被重复定义。
由于工程中的每个.c文件都是独立的解释的,即使头文件有
#ifndef _TEST_H_
#define _TEST_H_
....
#enfif
在其他文件中只要包含了global.h就会独立的解释,然后每个.c文件生成独立的标示符。在编译器链接时,就会将工程中所有的符号整合在一起,由于文件中有重名变量,于是就出现了重复定义的错误。
解决方法
在.c1文件中声明变量,然后建一个头文件(.h文件)在所有的变量声明前加上extern,注意这里不要对变量进行的初始化。然后在其他需要使用全局变量的.c2文件中包含.h文件。编译器会为.c2生成目标文件,然后链接时,如果该.c2文件使用了全局变量,链接器就会链接到此.c1文件 。
个人认为解决此类问题有几种办法:
1.在源文件里定义变量,在其他调用处使用extern
2.在头文件里使用宏定义
五、32位数据转换成16位或8位
转换机制为直接从32位数据中截取低16位或低8位。
若转换前后均为无符号数,则正常转换;
若转换前为32位有符号数而转换后为无符号数,则转换前的最高位符号位直接丢弃,直接截取低16位或低8位数据;
若转换前为32位无符号数而转换后为有符号数,则截取的低16位或低8位数据最高位表示符号位并且高16位或高24位会补齐符号位;
若转换前后均有符号数,则转换前的最高位符号位直接丢弃,截取的低16位或低8位数据最高位表示符号位并且高16位或高24位会补齐符号位。
当转换后为有符号数时,需特别注意。例如:
#include<stdio.h>
int main()
{
int a=0x5678ff07;
printf("%x
",a);
short b=(short)a;
printf("%x
",b);
return 0;
}
short b 默认为signed,由于为16位 ,截取后16位,舍弃高16位,则为ff07,最高位为1,所以为负数,
最高位会补齐,由于是负数,以1补齐,就变成了ffffff07,所以你只要定义为
unsigned short 才能保证转换后的数据为16位。
在上述例子中,尽管b是16位有符号数,但是经过转换后高16位均补齐了符号位1,所以仍然将b打印输出为32位数据。
在实际应用中,尽量保证转换后的数据为无符号数,最好是转换前后均为无符号数,这样可以减少一些错误转换。