最开始使用velocity时,输出中文乱码,我的解决办法 是在调用 mergeTemplate 方法时指定encoding为UTF-8,然后就正常了。...Velocity.mergeTemplate(String templateName, String encoding, Context context, Writer writer) 然而最近在使用velocity...写模板时发现宏(#macro)中如果有中文,就会输出乱码(之前一直没有在macro中使用过中文)。...宏之外的中文都能正常输出。...encoding 为UTF-8 Velocity.init(vprops);
C语言中宏定义分两种,无参的宏和有参的宏 1.无参数的宏 无参数宏定义的一般形式为: #define name value//name是你起的名字,就跟起函数名一样,value是你要给这个名字赋予什么值...2.有参数的宏 有参数宏的定义形式一般为: #define name(参数1,参数2,....) sentence//sentencen表示语句 //示例: #define max(a,b...宏进行定义时不会考虑参数的类型。 3. 参数宏的使用会使具有同一作用的代码块在目标文件中存在多个副本,即会增长目标文件的大小。 4....函数的调用会牵扯到参数的传递,压栈/出栈操作,速度相对较慢。 7. 函数的参数存在传值和传地址(指针)的问题,参数宏不存在。 3....,多加一层转换宏,加这层宏的用意是把所有宏的参数在中间曾全部展开。
{name}情况二:Velocity ${} 、$!{}、!${}的区别 前言情况一:{name}情况二:!{name}情况三:!{name} 情况一:{name}情况二:!...前言 在使用Velocity时经常会看到三种使用变量的情况 情况一:${name} 情况二:$!{name} 情况三:!${name} 那么三者之间到底有什么区别呢?莫慌!!!...{name}:输出表达式的计算结果,不进行过滤,常用来输出html片段 $!(var):如果有值则输出,如果为空,则不显示,其中的“!”...表示如果可以取到值则输出该值,如果取不到值或值为null,则输出空字符串即“”,即强制将不存在的变量显示为空白 情况三:!${name} !${name}:其中的“!”...就像js中的布尔操作符一样,表示取反 原文出处: Velocity学习(三)之 {} 和 !{}、!${}区别
参数 参数名称 默认值 描述 Filename Patterns (patterns) all Attachment Labels (labels) (None) 标签(labels)的列表,用来过滤附件的显示...)参数进行排序,来对附件按照升序或者降序进行排序。...如果你不输入页面的标题的话,宏将会显示附加到当前页面的所有文件。 Show Previews (preview) true 被用来显示一个附件文件的预览。...(最新的排在前面) Sort Order (sortOrder) ascending 使用组合的排序( Sort By )参数进行排序,来对附件按照升序或者降序进行排序。...Wiki 标记(markup) 示例 宏名称: attachments 宏内容: None {attachments:old=false|patterns=.*png,.
参数 参数名称 默认值 描述 Filename Patterns(patterns) all Attachment Labels(labels) (None) 标签(labels)的列表,用来过滤附件的显示...按照创建日期的倒序进行排序(最新的排在前面) Sort Order(sortOrder) ascending 使用组合的排序( Sort By )参数进行排序,来对附件按照升序或者降序进行排序。...如果你不输入页面的标题的话,宏将会显示附加到当前页面的所有文件。 Show Previews(preview) true 被用来显示一个附件文件的预览。...(最新的排在前面) Sort Order (sortOrder) ascending使用组合的排序( Sort By )参数进行排序,来对附件按照升序或者降序进行排序。...Wiki 标记(markup) 示例 宏名称: attachments 宏内容: None {attachments:old=false|patterns=.*png,.
0; } 五、带有副作用的宏参数 当宏参数在宏的定义中出现超过一次的时候,如果参数带有副作用,那么你在使用这个宏的时候就可能出现危险,导致不可预测的后果。...副作用就是表达式求值的时候出现的永久性效果。 x+1;//不带副作用 x++;//带有副作用 MAX宏可以证明具有副作用的参数所引起的问题。...(a) : (b)会对其中的参数进行求值,这可能导致参数被递增多次。 然而,在这个特定的MAX宏定义中,每个参数只出现一次,在条件运算符的左侧用于比较,在右侧用于作为结果返回。...在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号。如果是,它们首先被替换。 2. 替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替换。 3....宏可能会带来运算符优先级的问题,导致程容易出现错。 宏有时候可以做函数做不到的事情。比如:宏的参数可以出现类型,但是函数做不到。
test(a,b):result=a+bprint("result=%d"%(a+b))test(11,22)test(11,1)test(22,1)def test1(a,b=1):#b=1 是一个缺省参数...result=a+bprint("result=%d"%(a+b))test1(11)test1(11,b=22) #此处b=22 是一个命名参数
Named And Optional Arguments - 命名参数和可选参数 public partialclass NamedAndOptionalArguments : System.Web.UI.Page
1.带参数的宏定义中,宏名和新参表之间不能有空格, 2.在带参数的宏定义中,形参参数不分配内存单元,因此不必作类型定义。而宏调用中的实参有具体值,要用它去代换形参,因此必须作类型说明。...2; y = 3; max = MAX(x,y); printf("%d\n", max); system("pause"); return 0; } 3.在宏定义中的形参是标识符...4.在宏定义中,字符串内的形参通常要用括号括起来以避免出错。 5.带参的宏和代餐函数类似,但本质不同,除此之外,把同一表达式用函数处理和用宏处理两者的结果有可能不同。...这是因为普通函数调用时,实参传给形参的是值,而在宏定义时,要用表达式进行替换,即(i++)*(i++),所以I++会被执行两次。...6.宏定义也可以用来定义多个语句,在宏调用时,把这些语句又代换到源程序内。
一、命名参数 命名参数会潜在的改变编写代码的方式.这个新功能能使代码更容易阅读和理解....除非 知道这个方法的前前后后,否则 仅看一眼该方法,很难判断出该方法会执行何种操作.而通过命名 参数,就可以在提供参数值之前使用代码中的参数名,如下所示: File.Copy(sourceFileName...,就很容易阅读和理解这行代码将执行的操作.使用命名参数对最终的编译 没有影响,命名参数仅用在应用程序的编码中....test("li", "dd", 7,false); test("li", "dd", 7, true,false); } 这里也可以用到上述的命名参数...: test("li", "dd", 7, e:true); 这样d参数依然可以使用默认值,如果没有命名参数,想给e赋值,必须还要给d赋值.在使用可选参数的过程中,由于命名参数的出现,更提供了许多方便
命名参数会潜在的改变编写代码的方式.这个新功能能使代码更容易阅读和理解.... 在这行代码中,这个简单的方法使用3个参数,但实际传递给Copy()方法的是什么内容?...除非 知道这个方法的前前后后,否则 仅看一眼该方法,很难判断出该方法会执行何种操作.而通过命名 参数,就可以在提供参数值之前使用代码中的参数名,如下所示: File.Copy(sourceFileName...mytestFile.txt", destFileName: @"C:\myOtherFile.txt", overwrite:true); 现在通过命名参数...,就很容易阅读和理解这行代码将执行的操作.使用命名参数对最终的编译 没有影响,命名参数仅用在应用程序的编码中.
61.什么是可变参数宏 在上面的教程中,我们学会了变参函数的定义和使用,基本套路就是使用 va_list 、 va_start 、 va_end 等宏,去解析那些可变参数列表我们找到这些参数的存储地址后...使用宏连接符 ##要注意一下两条结论: 第一条:任何使用到胶水运算“##”对形参进行粘合的参数宏,一定需要额外的再套一层 第二条:其余情况下,如果要用到胶水运算,一定要在内部借助参数宏来完成粘合过程 为了理解这一...,我们都可以使用同一个参数宏CONNECT(),而CONNCT() 会自动计算用户给出参数的个数,从而正确的替换为CONNETn()版本。...;"part1" 中 CONNECT2() 的作用就是将 字符串“CONNCET”与这个数组组合起来变成一个新的“参数宏的名字”;而 "part2" 的作用则是给这个组装出来的参数宏传递参数。...之前,它要用用户至少传递10个参数; 这个宏的返回值就是第十个参数的内容; 多出来的部分会被"..."
https://blog.csdn.net/10km/article/details/80760533 如何计算可变参数__VA_ARGS__中的参数个数?...google上找了一下,网上答案不少,仔细看看原理都是一样的,比如这篇stackoverflow上的问题,给出的答案真不少, [《C++ preprocessor __VA_ARGS__ number...of arguments》][1] 但是排名第一的最佳答案有bug,在参数为空的时候计算错误。...经测试找到正确计算方式,自己写了一个,代码如下,gcc上测试通过(MSV不支持) // 计算 __VA_ARGS__ 参数个数,最大支持64个参数 #define FL_ARG_COUNT(...)
通常velocity是配合spring mvc之类的框架在web中使用,但velocity本身其实对运行环境没有过多的限制,在单独的java application中也可以独立使用,下面演示了利用velocity...string>用户,您好: 以下是 $date.format('yyyy-MM-dd',$model.deliverDate,$convert.toLocale("en_US")) 的发货清单...; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.runtime.RuntimeConstants...; import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader; import org.apache.velocity.tools.generic.ConversionTool...: 用户 您好: 以下是 2015-09-12 的发货清单,请核对!
前言 想实现类似NSLog那样支持多参数,和格式化等逻辑处理的宏 实现 字符串格式化 +(NSString*)getFormatStr:(NSString*)str, ... { if ([str...return result; } else { return [NSString stringWithFormat:@"%@",str]; } } 宏里面实现多参数输入...#define kGetFormatStr(Msg, ... ) [self getFormatStr:(Msg), ##__VA_ARGS__] 注意:##VA_ARGS 是必输的,不然会出现上一个调用宏的数据会污染下一个方法的数据...污染数据的例子: ? 最终实现: ?
场景开发过程宏时经常需要处理结构体或枚举体上的属性参数,如下 Command 结构体的 args 字段有属性 each = "arg",#[derive(Builder)]pub struct Command...}, Comma, // args 字段 Field { // 字段指定的属性参数集合...], }, }, }, // 其它字段省略 宏入口...{}; } // 遍历属性参数 for attr in f.attrs.iter() { // parse_builder_attr 解析当前的属性数据 let arguments...= parse_builder_attr(attr); // 根据属性参数再处理其它处理 } });}属性解析实现/// builder 属性参数数据类型struct BuilderAttribute
1.首先指出,NF_HOOK系列宏的outdev参数的传递方式(直接传递一个net_device结构体指针)是不正确的 正确的方式要么是不传递,要么是传递指针的地址,即地址的地址。...outdev参数,而不是reroute之后的skb_dst(skb)->dev。...因为OUTPUT处在路由之后,如果其中的mangle表改变了skb的mark,那么会reroute,不幸的是,reroute并无法改变OUTPUT点上NF_HOOK的outdev参数值!...4.怎么修正 办法很多,依次介绍: a.使用setsockopt打mark而不是iptables打mark,绕开OUTPUT和路由的暧昧关系; b.修改NF_HOOK的dev参数为struct net_device...宏的outdev参数,需要时从skb_dst(skb)->dev中实时获取; 很简单,在ipt_do_table的开头位置,即变量声明的完结处,加入下面的代码: struct xt_target_param
velocity模板其实就是java不分语法的翻译,用到的属性还是java的方法,get,set,等 1.截取部分字段substring 1 原始字符串:$!...velocity 中的数组对应 Java 中的 List 对象。...8.宏#macro其实也很简单 原来感觉不懂不敢碰,自从写了个velocity分页后就忽然觉得宏不要太好用。...于是想把id给变成参数,当我需要这个公用代码的时候,把id当参数传进去,最后render的结果就是html代码的id为我的参数。这样看来,宏就是一个函数。...传参数的宏: 1 #macro( tablerows $color $somelist ) 2 #foreach( $something in $somelist ) 3 <td bgcolor
大家好,又见面了,我是你们的朋友全栈君。 接触到一个老的项目,里面大量使用OleDbConnection进行数据库操作,在执行SQL块语句时,对它的顺序参数、命名参数很不了解。...据说不能使用命名参数,但我这里试验了一下,好像是可以的,只是对参数的顺序还是有要求。看看你能知道下面的输出结果吗?...System.Diagnostics; namespace ConsoleApplication1 { /// /// Class1 的摘要说明...sql = “ begin delete from B; insert into B(A,B) values(:a,:b); end; “ ; // 很正常的...select count(*) into v_exists from B where a=:a and b=:b and rownum < 2; “ + // 很正常的
#defineLOG(format,...)printf(format,__VA_ARGS__) 1 VA_ARGS VA_ARGS是系统预定义宏,被自动替换为参数列表 经常需要进行输出格式化,重定义操作时...; return 0; } 3 printf另外宏替换 #define LOG printf
领取专属 10元无门槛券
手把手带您无忧上云