一、先对全局变量的代码做讨论
- 平平无奇的两个文件的代码开始探索
- 平平无奇的现象
- 结论
第一、extern的值可以传递,定义了可以在另一个文件中访问出值;extern变量为定义未赋值时可以是0,这个0(是系统分配的)
第二、在源文件(.c文件)内写函数时,函数前面未加static时,可以认为在作用域源文件(.c文件)内----(这个例子就没在一个源文件中申明)
第三、在hi.c文件中没有引用头文件,也可使用printf函数,有可能说明,编译器在读源文件时:先把没有main函数的源文件放在main函数的上面和main函数源文件的头文件下面部分;简单的说,下次要在main函数源文件的上面写的很多的话,可以建立一个源文件,不引用头文件,直接写,默认是main函数上面和main源文件下头引用的西面部分。
二、对局部变量的代码做讨论
局部变量我感觉没啥谈的,但是要把关键字搞清楚,啥清楚了
extern关键字:extern的典型例子1;extern典型例子2;extern关键字的看法,主要针对extern函数的看法
register关键字:register使用注意点;register的例子
- 代码
//extern和局部变量的相关关系,应用\
extern定义的全部变量,上面提了一点\
extern定义函数时,上面也说了
#include <stdio.h>
int val = 9;
int max(int x,int y);
int foo()
{
int val = 2;
{
extern int val; //extern解决局部变量和全局变量重名的解决方法---花括号内加extern定义该变量
printf("val_foo = %d\n", val);
}
return val;
}
int main()
{
int val = 0;
printf("val_main1 = %d\n", val);
val = foo();
printf("val_main2 = %d\n", val);
int result;
/*外部变量声明*/
extern int g_X;
extern int g_Y;
result = max(g_X,g_Y);
printf("the max value is %d\n",result);
return val;
}
/*定义两个全局变量*/
int g_X = 10; //extern的全局变量作用域扩展到上面的用法
int g_Y = 20;
int max(int x, int y)
{
return (x>y ? x : y);
}
- 现象
- 结论
extern关键字可以扩展作用域、extern关键字可以修改变量的作用域。
请注意这两个说法看上去一样,实质不一样,“扩展”和“修改”;
extern只可声明函数,不可定义函数;
如果在b.c文件中定义了A函数,然后在对应的头文件(或者该b.c内)使用extern声明A函数;
A函数可以调用的作用域是:除去A函数定义b.c文件内,其它*.c文件都可调用
三、C语言的移植性
先看这个帖子的后半部分:直接看后半部分
再看看这个贴子:预处理命令的#pragma的相关帖子
最后看看这个帖子:#pragma的语法和C++的相关
“编译器的语法” :文件、函数名、时间变量
其中一小部分:
#include<stdio.h>
#define CAT(N) X ## N //## 在宏定义中将两个字符连接起来,构成一个新的标识符
#define PRINTF_XN(n) printf("X" # n "=%d\n",X ## n); //# 将对应变量字符串化
void testFunc(void){
printf("File = %s\nLine = %d\nFunc=%s\nDate=%s\nTime=%s\n", \
__FILE__, __LINE__, __FUNCTION__, __DATE__, __TIME__);
}
int main()
{
int i;
for(i=0; i<10;i++){
int CAT(1) = 2;
PRINTF_XN(1); //打印出X1=2
}
printf("\n\n");
testFunc();
printf("\n\n");
printf("当前源代码函数名:__FUNCTION__==%s\n",__FUNCTION__);
printf("当前源代码行号:__LINE__==%d\n",__LINE__);
printf("当前源代码文件名:__FILE__==%s\n",__FILE__);
printf("当前编译日期〔注意和当前系统日期区别开来〕:__DATE__==%s\n",__DATE__);
printf("当前编译时间〔注意和当前系统日期区别开来〕:__TIME__==%s\n",__TIME__);
printf("当前系统时间戳:__TIMESTAMP__==%s\n",__TIMESTAMP__);
printf("当要求程序严格遵循ANSIC标准时该标识符被赋值为1:__STDC__==%d\n",__STDC__);
// printf("当用C++编译程序编译时,标识符__cplusplus就会被定义:__cplusplus==%d\n",__cplusplus); //C语言编译器上没有这个变量cplusplus
return 0;
}
运行结果
四、打印各种字符的格式符号
/*
字符型 %c
短整型 %hd
整形 %d
长整形 %ld
长长整形 %lld
单精度浮点型 %f
双精度浮点型 %lf
无符号长整形 %lu
无符号正整形 %u
打印地址 %p
打印字符串 %s
输出十六进制数据 %x
输出八进制数据 %o
输入百分号 %%
*/
五、switch的case … 的使用
特别注意:“… ” 的左右两边都要有空格
#include<stdio.h>
//...的左右两边都要有空格
int main(){
int n;
scanf("%d",&n);
switch(n){
case 1 ... 4:printf("sdadada");break; //包含1和4
case 5 ... 9:printf("SDSDSA");break; //包含5和9 ...的左右两边都要有空格
}
return 0;
}