首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言定义(#define定义常量​、#define定义​、 带有副作用参数、 替换规则、 函数对比)

是一种将一系列命令组织在一起,作为一个单独命令来完成特定任务方式。在编译语言中,展开是在编译时进行,编译器会自动将替换为一系列指令。展开器是用于执行展开工具。...#define DOUBLE( x) ( ( x ) + ( x ) ) 提示: 所以用于对数值表达式进行求值定义都应该用这种方式加上括号,避免在使用时由于参数中操作符或邻近操作符之间不可预料相互作用...0; } 五、带有副作用参数​ 当参数在定义中出现超过一次时候,如果参数带有副作用,那么你在使用这个时候就可能出现危险,导致不可预测后果。...副作用就是表达式求值时候出现永久性效果。 x+1;//不带副作用​ x++;//带有副作用​ MAX可以证明具有副作用参数所引起问题。​...(x++) : (y++)); 在这个例子中,x和y都被传递给了MAX,并且它们都带有递增作用。由于MAX条件运算符(a) > (b) ?

14610
您找到你想要的搜索结果了吗?
是的
没有找到

Linux kernel中常见整理

区别在于标识符列表使用,作为不同参数之间分割符。每一个参数都是一个 token 化列表。在中空白符只起到分割 token 作用,空白符多少对于预处理器是没有意义。...一些奇技淫巧:https://gaomf.cn/2017/10/06/C_Macro/ 以下是整理一些linux kernel中常见,由于不同体系架构,或者不同模块定义不同,只挑选了其中容易看懂作为记录...Linux内核中do{...}while(0)意义: 辅助定义复杂,避免引用时候出错,如果不用{},if后面的语句只有第一条进行了判断。同时避免展开后“;”造成编译不通过....1 us 延时*/ 系统调用 linux 内核中最常见使用之一,系统调用 #define SYSCALL_DEFINE1(name, ...)...linux 内核一些错误码,以它们负数来作为函数返回值,简单地使用大于等于-4095虚拟地址来分别表示相应错误码。

1.9K50

Linux kernel中常见整理

区别在于标识符列表使用,作为不同参数之间分割符。每一个参数都是一个 token 化列表。在中空白符只起到分割 token 作用,空白符多少对于预处理器是没有意义。...一些奇技淫巧: https://gaomf.cn/2017/10/06/C_Macro/ 以下是整理一些linux kernel中常见,由于不同体系架构,或者不同模块定义不同,只挑选了其中容易看懂作为记录...Linux内核中do{...}while(0)意义: 辅助定义复杂,避免引用时候出错,如果不用{},if后面的语句只有第一条进行了判断。同时避免展开后“;”造成编译不通过....1 us 延时*/ 系统调用 linux 内核中最常见使用之一,系统调用: #define SYSCALL_DEFINE1(name, ...)...linux 内核一些错误码,以它们负数来作为函数返回值,简单地使用大于等于-4095虚拟地址来分别表示相应错误码。

1.6K20

Linux内核container_of深度剖析

1、前面说 我在好几年前读linux 驱动代码时候看到这个,百度了好久,知道怎么用了,但是对实现过程和原理还是一知半解。...container_oflinux内核代码里面使用次数非常非常多,对于喜欢linux编程同学来说,了解其实现方法,对以后看内核代码,写内核驱动帮助都非常大,当然,我不是说了解这个就可以为所欲为了...2、container_of作用 container_of作用通过结构体成员变量地址获取这个结构体地址,假设你名字叫李光明,你还有一个弟弟叫做XXX,警察叔叔发现你弟弟XXX干了一件坏事,但是警察叔叔不知道你弟弟名字...4.5、const int* p作用 上面的定义里面还有一个小知识点 const typeof( ((type *)0)->member ) *__mptr 上面的代码可以简写成 const int...6、实例代码 经过上面的解释,至少对这个有感觉了吧,写个代码来测试一下,让自己与代码融合为一体,这样才能做到人码合一境界。

70021

详解 Linux 常用目录作用

详解 Linux 常用目录作用 一 常用一级目录 ? ? 注意: 1、根目录下bin和sbin,usr目录下bin和sbin,这四个目录都是用来保存系统命令。...2、bin目录下命令时任何用户都能执行,sbin目录下命令只有超级用户才能执行。 3、media用来挂载光盘,misc挂载磁带机,mnt挂载U盘。它们都是空目录。...4、proc和sys目录不能直接操作,这两个目录保存是内存挂载点。 5、可以在家目录root或home,以及tmp目录下随便放内容。...mozilla udev firmware jvm-commmon polkit-1 udisks2 games jvm-exports python2.7 x86_64-redhat-linux6E...srv tmp var boot etc japan lib64 mnt opt root sbin sys usr 如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站支持

2.6K10

linux 虚拟内存作用

虚拟内存作用 利用磁盘起到缓存作用,提高进程访问磁盘速度。 虚拟内存可以为进程提供独立内存空间,并通过动态链接库共享内存。...在其中使用就是局部性原理,当操作系统访问未被缓存页,就会发生缺页中断,操作系统需要将磁盘上未被缓存虚拟页加载到物理内存中。...目前linux系统,采用四层页表结构页表结构,每个9位,最低12位作为偏移量。...总 虚拟内存可以结合磁盘和物理内存优势为进程提供看起来速度足够快并且容量足够大存储; 虚拟内存可以为进程提供独立内存空间并引入多层页表结构将虚拟内存翻译成物理内存,进程之间可以共享物理内存减少开销...,也能简化程序链接、装载以及内存分配过程; 虚拟内存可以控制进程对物理内存访问,隔离不同进程访问权限,提高系统安全性;

3.4K20

Linux目录作用【值得收藏】

/dev:存放linux系统下设备文件,访问该目录下某个文件,相当于访问某个设备,常用是挂载光驱 mount /dev/cdrom /mnt /etc :系统管理文件和配置文件放置处,需要配置服务等等时候访问.../home :用户主目录基点,比如用户user主目录就是/home/user,可以用~user表示 /sbin :超级管理命令,这里存放是系统管理员使用管理程序,用户可以使用哪些管理程序 /tmp...:公共临时文件存储点 /root :系统管理员主目录 /var :某些大文件溢出区,大多数存日志信息 /user :软件放置处 /boot :存放开机及内核文件 /opt:给主机额外安装软件所摆放目录.../bin: /usr/bin: 可执行二进制文件目录,如常用命令ls、tar、mv、cat等 ?

2.2K30

Linux内核中container_of详细解释

如何移植并使用Linux内核通用链表(附完整代码实现)中提到为什么在结构体中要把 struct list_head放在首位。...container_of #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE*)0)->MEMBER) #define container_of(ptr,...container_of作用是通过结构体内某个成员变量地址和该变量名,以及结构体类型。找到该结构体变量地址。...这里使用是一个利用编译器技术小技巧,即先求得结构成员在结构中偏移量,然后根据成员变量地址反过来得出主结构变量地址。..."sptr=%p\n",sptr); return 0; }   运行结果如下: sptr=0xffffcb90 sptr=0xffffcb90 sptr=0xffffcbb4   展开可能会看更清楚一些

1.2K10

Linux TraceEvent - 我见过史上最长定义

可以看到 目录名称sample-trace由TRACE_SYSTEM这个定义,所以通过查找这个,就能知道有多少events大类 每一个TRACE_EVENT都有一个自己目录 源文件中trace_XXX...那么这些函数是怎么定义呢? TRACE_EVENT定义 看完了例子,我们就该看代码实现了。讲真,这是我见过最长展开了。...怎么能很好解释这个展开过程呢?还是用一张图吧。倒吸一口气,准备一次无尽代码阅读。 ? 终于完了,也不知道有没有漏掉什么。。。...不过相信我,你可能不太会愿意去看这个(捂脸) 回过头来再看这展开,让我们来总结一下这个过程: 一共包含了两个头文件:linux/tracepoint.h 和 trace/define_trace.h 在...哪怕有了上面这个图,我想大部分人也是不会去看。或者说,看了可能也不知道这些展开究竟定义了些什么?

4.1K40

Linux】open函数参数和作用

大家好,又见面了,我是你们朋友全栈君。 一、open函数用来干什么 open函数在Linux下一般用来打开或者创建一个文件,我们可以根据参数来定制我们需要文件属性和用户权限等各种参数。...二、open函数定义和参数 我们首先来看下open函数在Linux定义 #include #include #include <fcntl.h...,和用户掩码umask有关,比如0644表示-rw-r–r–,也可以用S_IRUSR、S_IWUSR等定义按位或起来表示,详见open(2)Man Page。...第三个参数是在第二个参数中有O_CREAT时才作用,如果没有,则第三个参数可以忽略 三、open函数与fopen函数区别 从来源来分,这两者很好区分: open函数是Unix下系统调用函数,操作成功返回是文件描述符...,操作失败返回是-1, fopen是ANSIC标准中C语言库函数,所以在不同系统中调用不同内核API,返回是一个指向文件结构指针。

3.3K10

Linux mmap 作用是什么?

表示要映射到内存区域起始地址,通常用 NULL,表示由内核指定该内存地址。...length 表示映射区长度,单位字节。 prot 参数描述了映射所需内存保护(并且不得与文件打开模式冲突)。...它值可以是一个或者多个以下位组合体: MAP_FIXED //使用指定映射起始地址,如果由start和len参数指定内存区重叠于现存映射空间,重叠部分将会被丢弃。...如果指定起始地址不可用,操作将会失败。并且起始地址必须落在页边界上。 MAP_SHARED //与其它所有映射这个对象进程共享映射空间。对共享区写入,相当于输出到文件。...4.作用 mmap 主要有两点作用: 文件映射,减少数据拷贝,提高 IO 效率。 将文件映射到进程地址空间。

23930

【Android NDK 开发】JNI 方法解析 ( JNIEXPORT 与 JNICALL 定义作用 )

("default"))) #define JNICALL JNIEXPORT 在 Windows 与 Linux 分别对应不同定义 ; 2 ....JNIEXPORT 定义作用 : Windows 中如果需要生成动态库 , 并且需要将该动态库交给其它项目使用 , 需要在方法前加入特殊标识 , 才能 在外部 程序代码中 调用该 DLL 动态库中定义方法...(“default”))) 标识 ; 该声明作用是保证在本动态库中声明方法 , 能够在其他项目中可以被调用 ; 3 ....JNICALL定义作用 : ① Windows JNICALL : JNICALL 被定义为 __stdcall , __stdcall 是一种函数调用参数约定 , 在 Windows 中调用函数时...JNIEXPORT 和 JNICALL 替换分析 ( Linux 平台 ) : ① 使用 JNIEXPORT 和 JNICALL 原始方法 : extern "C" JNIEXPORT void JNICALL

73620

Linux目录结构和作用

这是最庞大目录,要用到应用程序和文件几乎都在这个目录。.../usr/x11r6 存放x window目录 /usr/bin 众多应用程序 /usr/sbin 超级用户一些管理程序 /usr/doc Linux文档 /usr/include linux下开发和编译应用程序所需要头文件.../usr/lib 常用动态链接库和软件包配置文件 /usr/man 帮助文档 /usr/src 源代码,linux内核源代码就放在/usr/src/linux里 /usr/local/bin 本地增加命令.../usr/local/lib 本地增加库 /opt 额外安装可选应用程序包所放置位置。...共享库又叫动态链接共享库,作用类似windows里.dll文件,存放了根文件系统程序运行所需共享文件。 /tmp 用于存放各种临时文件,是公用临时文件存储点。

1.2K10

Java中变量,替换详解。

群友在微信群讨论一个话题,有点意思,特拿出来分享一下。 输出true false 来看下面这段程序,和群友分享大致一样。...首先来理解下变量: Java中,一个用final定义变量,不管它是类型变量,只要用final定义了并同时指定了初始值,并且这个初始值是在编译时就被确定下来,那么这个final变量就是一个变量。...编译器会把程序所有用到该变量地方直接替换成该变量值,也就是说编译器能对变量进行替换。...final String a = "hello"; final String b = a; final String c = getHello(); a在编译期间就能确定下来,而b、c不行,所以a是变量...所以,再回到上面的程序,finalWorld2和finalWorld4是final定义,也是在编译期间能确定下来,所以它能被替换,编译器就会让finalWorld2和finalWorld4指向字符串池中缓存字符串

3.6K50
领券