C语言的extern、__DATE__等宏和各种类型的打印

一、先对全局变量的代码做讨论

  1. 平平无奇的两个文件的代码开始探索
    在这里插入图片描述
  2. 平平无奇的现象
    在这里插入图片描述
  3. 结论
    第一、extern的值可以传递,定义了可以在另一个文件中访问出值;extern变量为定义未赋值时可以是0,这个0(是系统分配的)
    第二、在源文件(.c文件)内写函数时,函数前面未加static时,可以认为在作用域源文件(.c文件)内----(这个例子就没在一个源文件中申明)
    第三、在hi.c文件中没有引用头文件,也可使用printf函数,有可能说明,编译器在读源文件时:先把没有main函数的源文件放在main函数的上面和main函数源文件的头文件下面部分;简单的说,下次要在main函数源文件的上面写的很多的话,可以建立一个源文件,不引用头文件,直接写,默认是main函数上面和main源文件下头引用的西面部分。

二、对局部变量的代码做讨论

局部变量我感觉没啥谈的,但是要把关键字搞清楚,啥清楚了
extern关键字:extern的典型例子1extern典型例子2extern关键字的看法,主要针对extern函数的看法
register关键字:register使用注意点register的例子

  1. 代码
//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);   
}

  1. 现象

在这里插入图片描述

  1. 结论
    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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值