Linux c括号作用域【原创笔记】

大师指点后,所做的笔记,很感谢一起愿意研究技术的同事,以下不是本人原创,是他分析的成果

#include <stdio.h>
#include <time.h>

struct lock_class_key {
    int ck;
};

#define mutex_init()                    \
do {                                    \
    static struct lock_class_key __key;    \
    static int a; \
                                    \
    printf("macro==>>Line=%d,&__key=0x%p &a=0x%p\n", __LINE__, &__key, &a);        \
} while (0)

void __mutex_init()
{
    do {
        static struct lock_class_key __key1;
        static int a1;
        printf("function==>>Line=%d,&__key1=0x%p &a1=0x%p\n", __LINE__, &__key1, &a1);
    } while (0);

}

int main(void)
{
//do { static struct lock_class_key __key; static int a; printf("macro==>>Line=%d,&__key=0x%p &a=0x%p\n", 28, &__key, &a); } while (0);===>宏展开就是这样的,gcc -E -o test.i test.c
//do { static struct lock_class_key __key; static int a; printf("macro==>>Line=%d,&__key=0x%p &a=0x%p\n", 29, &__key, &a); } while (0);

//{ static struct lock_class_key __key; static int a; printf("macro==>>Line=%d,&__key=0x%p &a=0x%p\n", 28, &__key, &a); }
//{ static struct lock_class_key __key; static int a; printf("macro==>>Line=%d,&__key=0x%p &a=0x%p\n", 29, &__key, &a); }

    {static int b1;} //=======>这种括号是作用域,一个函数名本来只有一个作用域,但是如果函数里面加了这种,相当于是在两个作用域里面,是允许这样定义的,地址也会不同
//printf("fuck!!\n");
    {static int b1;}
    mutex_init();
    mutex_init();
    __mutex_init();
    __mutex_init();

    return (0);
}

执行结果:

macro==>>Line=37,&__key=0x0x60104c &a=0x0x601050
macro==>>Line=38,&__key=0x0x601054 &a=0x0x601058
function==>>Line=21,&__key1=0x0x601044 &a1=0x0x601048
function==>>Line=21,&__key1=0x0x601044 &a1=0x0x601048

 

时间: 2024-09-20 23:38:20

Linux c括号作用域【原创笔记】的相关文章

kali linux web渗透测试学习笔记

    kali linux web渗透测试学习笔记 metasploit使用方法: 启动: 第一步:启用Postgresql服务.service postgresql start 第二步:启用metasploit服务.service matasploit start 第三步:启动框架.msfconsole 一个ASP站点的sql注入 测试数字型注入点 1.网址:asp?ID+13,后面加',看看是什么数据库,然后输入1=1,1=2,得到数据库是microsoft acess 2.转用sqlma

Linux下Vi/Vim使用笔记

Linux下Vi/Vim使用笔记 启动和关闭vim vi 打开 Vi/Vim 打开 Vi/Vim 并加载文件 <file> vi <file>  ZQ 无条件退出 :q! 无条件退出 ZZ 存盘并退出 :wq 存盘并退出 vim编辑器的三种模式:一般模式.编辑模式和命令行模式在一般模式中可以进行删除.复制和粘贴的功能,但是无法编辑文件内容. 从一般模式切换到编辑模式可以按下i.I.o.O.a.A.r.R键. 注意区分当前是INSERT还是REPLACE模式! i: 插入,从目前光标

Linux硬盘的检测(原创)

概述  随着硬盘容量.速度的快速发展,硬盘的可靠性问题越来越重要,今天的单块硬盘存储容量可轻松达到1TB,硬盘损坏带来的影响非常巨大. 不同的文件系统(xfs,reiserfs,ext3)都有自己的检测和修复工具.检测之前可以先使用dmesg命令查看有没有硬件I/O故障的日志,如果有,先用fsck看看是不是文件系统有问题,如果不是则可以使用下面介绍硬盘检测和优化方法来修复它. grep"error"/va/log/messages*;Linux检测硬盘坏道 使用SMART检测硬盘  S

Linux模块详解(原创)

linux模块概述内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),我们简称为模块.Linux内核之所以提供模块机制,是因为它本身是一个单内核(monolithic kernel).单内核的最大优点是效率高,因为所有的内容都集成在一起,但其缺点是可扩展性和可维护性相对较差,模块机制就是为了弥补这一缺陷.模块是具有独立功能的程序,它可以被单独编译,但不能独立运行.它在运行时被链接到内核作为内核的一部分在内核空间运行,这

零基础入门篇之Linux及Arm-Linux程序开发笔记_linux shell

前言:本文记录了自己从一个完全不懂Linux的人如何一步步学会Linux程序开发的过程.当然也希望本文能够达到它的目的,让那些和我一样没有任何基础的人也能快速入门Linux程序开发. 一.Arm-Linux程序开发平台简要介绍     Arm-Linux程序的开发并不像我们以前接触的Windows程序开发那样,关于平台的搭建就繁琐很多,所以在正式进入程序开发之前先对这种开发模式进行简要介绍,让一个即使没有任何Linux开发经验的程序员也能够看懂后面的内容. 1.1程序开发所需系统及开发语言   

Linux基础命令大全(笔记一)_Linux

很多刚开始学习linux的朋友,肯定要接触linux肯定要先学习linux常用命令,最近整理了一下.具体如下: 1.Linux启动等级[ linit  n ] 0-系统停机状态 1-单用户工作状态 2-多用户状态(没有NFS) 3-多用户状态(有NFS) 4-系统未使用,留给用户 5-图形界面 6-系统正常关闭并重新启动  命令 与文件.目录相关的命令­­ ls[列出目录] ls -L    //d开头目录,-开头文件,竖着列 ls –m   //横着列 ls –R   //树状结构列 //-.

用Linux命令行使用Evernote笔记应用

在Linux命令行中管理你的Evernote记录笔记.要是你从来没有听说过它,Evernote 专门有一个用户友好的在线服务可以在不同的设备间同步笔记.除了提供花哨的基于Web的API,Evernote还发布了在Windows.Mac.Android和iOS上的客户端.然而至今还没有官方的Linux客户端可用.老实说在众多的非官方Linux客户端中,有一个程序一出现就吸引了所有的命令行爱好者,它就是Geeknote. Geeknote 的安装 Geeknote是使用Python开发的.因此,在开

Linux内核设计与实现笔记(一) 虚拟文件系统、块I/O层

虚拟文件系统   系统内所有文件系统不但依赖VFS共存,而且也依靠VFS系统协同工作. VFS使得用户可以直接使用open/read/write等系统调用,而无需考虑具体文件系统和实际物理介质. VFS中具有四个主要的对象类型: 超级块 super_block       代表一个已安装的文件系统 通常对应于存放在磁盘特定扇区中的文件系统超级块或文件系统控制块. 索引节点 inode 代表文件系统中(虽然索引节点仅当文件被访问时,才在内存中创建)的一个文件,它也可以是设备或管道这样的特殊文件 包

Linux Shell脚本编程学习笔记和实战

http://www.1987.name/141.html shell基础 终端打印.算术运算.常用变量 Linux下搜索指定目录下特定字符串并高亮显示匹配关键词 从键盘或文件中获取标准输入 [read命令] 文件的描述符和重定向 数组.关联数组和别名使用 函数的定义.执行.传参和递归函数 条件测试操作与流程控制语句 获取时间日期格式和延时 [date.sleep命令] 内部字段分隔符IFS和脚本的调试DEBUG 显示.读取或拼接文件内容 [cat命令] 文件查找与打印文件列表 [find命令]