今天总结一下宏和函数的区别,还有各自的优缺点。宏在预处理阶段会被编译器替换掉,而且宏一般只做简单的文本替换,编译器对其不做任何的语法检测。宏定义时主要用于以下两方面:1、简单文本或字符串的替换;2、宏函数。对于宏函数,我们可能比较陌生,下面举例来介绍一下宏函数:#define SQUARE(x) ((x)*(x))
int main()
{
int input;
pri
转载
2023-11-02 07:00:18
121阅读
更加灵活的方式控制源代码。 实施条件编译,即有选择地编译
原创
2023-06-15 11:12:03
147阅读
上学的时候就没搞清楚这两个东东的关系,原本以为是多么难得事情,今天仔细瞧瞧就那么回事。(浮躁的大学哦.....)宏定义:其作用就是“换其名曰”,给程序中的一段特殊的代码--函数,数据取了个简单明了的名字。不过有一点这家伙的作用范围是全局的。即使它是在某一个函数块中定义的。这个其实也容易理解。因为宏定义是预定义的一种,在我们的程序之前,由预编译器(Cpp)提前编译出来了,那个时候程序里的结构是个啥样
转载
2024-03-11 15:20:04
88阅读
内存屏障主要解决的问题是编译器的优化和CPU的乱序执行。编译器在优化的时候,生成的汇编指令可能和c语言程序的执行顺序不一样,在需要程序严格按照c语言顺序执行时,需要显式的告诉编译不需要优化,这在linux下是通过barrier()宏完成的,它依靠volidate关键字和memory关键字,前者告诉编译barrier()周围的指令不要被优化,后者作用是告诉编译器汇编代码会使内存里面的值更改,编译器应使用内存里的新值而非寄存器里保存的老值。同样,CPU执行会通过乱序以提高性能。汇编里的指令不一定是按照我们看到的顺序执行的。linux中通过mb()系列宏来保证执行的顺序。具体做法是通过mfence/
转载
2012-11-28 17:15:00
421阅读
2评论
__init位置:/include/linux/init.h定义:#define __init __attribute__ ((__section__ (".init.text")))注释:这个标志符和函
转载
2023-07-03 10:20:39
289阅读
Q_OBJECT宏的作用 The Q_OBJECT macro at the beginning of the class definition is necessary for all classes that define sisignal和slot机制QT的信号与
转载
2023-06-18 00:10:51
137阅读
内核的部分函数带有__init和__exit宏,负责“初始化”和“清理收尾”该函数。如果该模块被编译进内核,而不是动态加载。宏 __init的使用会在初始化完成后丢弃该函数并收回所占内存,
宏__initdata同__init 类似,只不过对变量有效。简单来说是指示gcc把标记的数据或者函数放到指定sector。
linux中把一些启动及初始化时候用的数据用__init标识,然后在适当的时
转载
2015-03-24 13:05:00
119阅读
2评论
断言(assert宏)的副作用 我的确对#define的很多种用法都深恶痛绝,唯对定义在中的assert宏情有独钟。说句实话,我鼓励大家多多使用它--前提是用好它。但问题就在于能不能用好它。 实现的方式固然百家争鸣,不过assert宏多数情况下和下面的定义相差不远: gotcha28/myassert.h #ifndef NDEBUG #define assert(e) ((e) / ? ((void)0) / :__assert_failed(#e,__FILE__,__LINE__) ) #else #define assert(e) ((void)0) #endif 如果ND...
原创
2022-01-04 15:49:04
435阅读
尽管一些用户发现宏易于使用,但使用它们仍有一些主要限制。 尽管您可以使用宏来执行任务,但是对于何时以及如何执行这些任务的控制有限,并且设置条件可能很困难。 但是,还有一个更强烈的理由不使用宏,那就是当在宏的执行过程中引发错误时,很难捕获错误,因此很难调试。 一些简单的VBA编程技能可以替代宏中可用的所有功能,并且随着您变得更加熟练,可以执行更多的任务,而宏则无法实现。 逐项列出,使用VBA而不
转载
2024-05-02 10:23:36
37阅读
简介1、Bean的5种作用域(1)singleton:单例模式,Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象Singleton作用域是Spring中的缺省作用域,也可以显示的将Bean定义为singleton模式,配置为: <bean id="userDao" class="com.ioc.UserDaoImpl" scope="si
转载
2024-06-13 09:40:54
41阅读
其中的PUZZLE 4给出了一个关于宏的谜题。值得研究。[c-sharp] view plaincopy#include <stdio.h> #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { printf("%s/n",h(f(1,2))); printf("%s/n",g(
转载
2013-08-29 20:28:00
118阅读
2评论
#与#define结合,如:#define toString(s) #s代表将s转换为对应字符串,如toString(1234)代表"1234",toString(123 4)代表"123 4" ##与#define结合,如:#define connect(x,y) x##y代表链接x与y,connect(x,y)表示xyPS:今天将toStri
原创
2013-09-10 21:53:56
520阅读
有空试试 表示宏内引用的文件确保只被使用Objective-C语言的文件所引用,保证引用关系的清晰。
转载
2016-04-04 15:01:00
138阅读
2评论
2._REENTRANT宏在一个多线程程序里,默认情况下,只有一个errno变量供所有的线程共享。在一个线程准备获取刚才的错误代码时,该变量很容易被另一个线程中的函数调用所改变。类似的问题还存在于fputs之类的函数中,这些函数通常用一个单独的全局性区域来缓存输出数据。为解决这个问题,需要使用可重入的例程。可重入代码可以被多次调用而仍然工作正常。编写的多线程程序,通过定义宏_REENTRANT来告
转载
2011-09-15 11:28:00
67阅读
2评论
在linux内核中重新定义了printk,如pr_debug,dev_dbg等。要使用这些宏函数就需要定义DEBUG。 详见:kernel printk信息显示级别 那么DEBUG该定义在什么地方呢? 定义到pr_debug或dev_dbg头文件中,则内核所有的宏都起作用。则打印信息太多,不易调试。
转载
2017-03-16 21:56:00
69阅读
2评论
看到开放源代码,宏定义经常这样用#define some() do { do_somt_thing(); } while (0)为什么这样用?能够试一下。假如一个普通宏定义#define some(x) Fun1(x);Fun2(x)if(condition) some(...
转载
2015-07-01 16:57:00
112阅读
2评论
假如没有aop,在做日志处理的时候,我们会在每个方法中添加日志处理,比如但大多数的日子处理代码是相同的,为了实现代码复用,我们可能把日志处理抽离成一个新的方法。但是这样我们仍然必须手动插入这些方法。但这样两个方法就是强耦合的,假如此时我们不需要这个功能了,或者想换成其他功能,那么就必须一个个修改。通过动态代理,可以在指定位置执行对应流程。这样就可以将一些横向的功能抽离出来形成一个独立的模块,然后在
Spring的作用: 1.Spring是一个开元的轻量级的应用开发框架,其目的是用于简化企业级应用程序开发,减少侵入; 2.Spring的IOC和AOP应用,将组件的耦合度降至最低,即解耦,便于系统的维护和升级; 3.可以与第三方框架和技术整合应用,可以自由选择技术进行开发。spring的优点: (1)降低组件之间的耦合度,实现软件各层之间的解耦合。 (2)可以使用容器提供
转载
2024-03-22 21:13:42
15阅读
前言: 最近没事在浏览Spring官网,简单写一些相关的笔记 Spring可以用来指Spring Framework项目本身,它就是从这里开始的。随着时间的推移,其他Spring项目都建立在Spring框架之上。通常,当人们说Sp
转载
2024-02-21 19:46:48
43阅读
可以通过开启宏VLIB_BUFFER_TRACE_TRAJECTORY,在mbuf里记录mbuf经过的node个数以及所经过的node的index: if (VLIB_BUFFER_TRACE_TRAJECTORY && frame) {  
原创
2016-08-25 11:45:54
3101阅读