今天总结一下和函数区别,还有各自优缺点。在预处理阶段会被编译器替换掉,而且一般只做简单文本替换,编译器对其不做任何语法检测。定义时主要用于以下两方面: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、Bean5种作用域(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.SpringIOC和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个数以及所经过nodeindex:        if (VLIB_BUFFER_TRACE_TRAJECTORY && frame)        {    &nbsp
原创 2016-08-25 11:45:54
3101阅读
  • 1
  • 2
  • 3
  • 4
  • 5