我刚学会了X-Macros.您看过X-Macros的实际用途?他们什么时候成为工作的合适工具?
我正在迁移一个UIViewController
类,用Swift训练一下.我通过桥接头成功使用Objective-C代码,但我需要导入包含#define
指令的常量文件.
我在使用Swift与Cocoa和Objective-C(简单宏)中看到了以下内容:
简单的宏
在通常使用该
#define
指令在C和Objective-C中定义基本常量的地方,在Swift中使用全局常量代替.例如,常量定义#define FADE_ANIMATION_DURATION 0.35
可以在Swift中更好地表达let FADE_ANIMATION_DURATION = 0.35
.因为简单的类似常量的宏直接映射到Swift全局变量,所以编译器会自动导入在C和Objective-C源文件中定义的简单宏.
所以,似乎有可能.我已经将包含我的常量的文件导入到桥接头中,但是我的.swift
文件没有可见性,无法解析.
我该怎么做才能让我的常量对Swift可见?
更新:
它似乎与NSString
常量一起使用,但不适用于布尔值:
#define kSTRING_CONSTANT @"a_string_constant" // resolved from swift
#define kBOOL_CONSTANT YES // unresolved from swift
Run Code Online (Sandbox Code Playgroud) 在gcc命令行中,我想定义一个字符串-Dname=Mary
,然后在我要printf("%s", name);
打印的源代码中Mary
.
我怎么能这样做?
1. #define NUM 10
2. #define FOO NUM
3. #undef NUM
4. #define NUM 20
5.
6. FOO
Run Code Online (Sandbox Code Playgroud)
当我只运行预处理器时,输出文件包含20.
但是,根据我的理解,预处理器只是简单地替换文本.所以这就是我认为正在发生的事情(这显然是错误的但是很蠢):
所以我认为输出应该是10而不是20.可以解释它出错的地方吗?
我今天遇到了这种语法,无法理解其含义:
// Uses the GNU C statement expression extension
#define envSet(name) ({ \
static int initialised; \
static bool set; \
(void) "" name; \
if (!initialised || !g_cacheEnv) { \
const char *value = getenv(name); \
set = value != NULL; \
initialised = true; \
} \
set; \
})
Run Code Online (Sandbox Code Playgroud)
我无法理解的具体路线是:
(void) "" name; \
Run Code Online (Sandbox Code Playgroud)
有人可以对此有所了解吗?
C#能否像使用预处理器语句在C编程语言中那样定义宏?我想简化某些重复语句的常规输入,如下所示:
Console.WriteLine("foo");
Run Code Online (Sandbox Code Playgroud) 我希望有人可以解释linux内核源代码中使用的__user宏的细微差别.
首先,宏观:
# define __user __attribute__((noderef, address_space(1)))
Run Code Online (Sandbox Code Playgroud)
现在,经过一些谷歌搜索后,我读到这个宏允许一个指针指定属于用户地址空间,并且不应该取消引用它.
我可能会遗漏一些明显的事实,但有人可以解释这样一个宏的含义吗?例如,这个宏的使用位置有什么好的例子?如果我错过了一些明显的东西,请再次原谅我.
为了把它放在某些环境中,我在检查一些USB代码(linux/usbdevice_fs.h)时遇到了宏.我只是在寻找对内核中使用的这个宏(或其他类似的宏)的一般理解.
谢谢你的期待!
我对Macros非常感兴趣,刚刚开始了解它的真正力量.请帮我收集宏系统的一些很好的用法.
到目前为止,我有这些结构:
模式匹配:
安德鲁赖特和布鲁斯杜巴.Scheme的模式匹配,1995
Prolog精神的关系:
Dorai Sitaram.在schelog中编程. http://www.ccs.neu.edu/home/dorai/schelog/schelog.html
Daniel P. Friedman,William E. Byrd和Oleg Kiselyov.理性的计划者.麻省理工学院出版社,2005年7月
Matthias Felleisen.将Prolog音译为方案.技术报告182,印第安纳大学,1985年.
可扩展循环结构:
塞巴斯蒂安·埃格纳 方案中的热切理解:SRFI-42的设计."计划与功能规划研讨会",2005年9月第13-26页.
奥林颤抖.循环的解剖:范围和控制的故事.在国际功能规划会议,第2-14页,2005年.
班级系统:
PLT.PLT MzLib:图书馆手册.技术报告PLT-TR2006-4-v352,PLT方案公司,2006年 http://www.plt-scheme.org/techreports/
Eli Barzilay.骗取. http://www.barzilay.org/Swindle.
组件系统:
Ryan Culpepper,Scott Owens和Matthew Flatt.组件接口中的语法抽象.在生成编程和组件工程国际会议,第373-388页,2005年
软件合同检查
Matthew Flatt和Matthias Felleisen.单位:用于HOT语言的酷模块在ACM SIGPLAN会议上编程语言设计和实现,第236-248页,1998年
Oscar Waddell和R. Kent Dybvig.扩展句法抽象的范围.在编程语言原理研讨会上,第203-215页,第199页
解析器生成器
Scott Owens,Matthew Flatt,Olin Shivers和Benjamin McMullan.Scheme中的Lexer和解析器生成器.关于计划和功能规划研讨会,2004年9月第41-52页.
工程语义工具:
Matthias Felleisen,Robert Bruce Findler和Matthew Flatt.PLT Redex的语义工程.MIT出版社,2009年8月.
编译器转换的规范:
Dipanwita Sarkar,Oscar Waddell和R. Kent Dybvig.用于编译器教育的纳米框架.功能规划期刊,15(5):653-667,2005年9月.教育明珠.
新的执行形式
具有可序列化延续的Servlet Greg Pettyjohn,John Clements,Joe Marshall,Shriram Krishnamurthi和Matthias Felleisen.广义堆栈检查的延续.在国际功能规划会议上,第216-227页,2005年.
定理证明系统
塞巴斯蒂安·埃格纳 方案中的热切理解:SRFI-42的设计.在计划与功能规划研讨会上,2005年9月第13-26页.
基类的扩展与类型
Sam Tobin-Hochstadt和Matthias Felleisen.打字方案的设计和实施.在编程语言原理研讨会上,第395-406页,2008年.
怠惰
Eli Barzilay和John Clements.没有辛勤工作的懒惰:将懒惰和严格的语言结合起来进行教学.在教育中的功能和声明性编程中,第9-13页,2005年. …
如何为Jinja2宏处理额外的args和kwargs?文档不是很清楚.
例如,这显然是错误的:
{% macro example_1(one, two, **kwargs) %}
do macro stuff
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)
结果
jinja2.exceptions.TemplateSyntaxError
TemplateSyntaxError: expected token 'name', got '**'
Run Code Online (Sandbox Code Playgroud)
该文件说:
kwargs
像varargs但是关键字参数.所有未使用的关键字参数都存储在此特殊变量中.
不幸的是,任何额外关键字参数的组合都是错误,
{% macro example_2(one, two) %}
do macro stuff
{% endmacro %}
{{ example_2(one, two, test='test') }}
TypeError: macro 'example_2' takes no keyword keyword argument 'test'
Run Code Online (Sandbox Code Playgroud)
我没有例子,也没有在Jinja2源代码atm中讨论.此时我不清楚文档.任何想法都赞赏.
Swift目前是否支持宏,还是未来计划增加支持?目前我散布:
Log.trace(nil, function: __FUNCTION__, file: __FILE__, line: __LINE__)
Run Code Online (Sandbox Code Playgroud)
在我的代码中的各个地方.