`
standalone
  • 浏览: 596836 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

C中的宏 [Macro in C]

    博客分类:
  • c
阅读更多
最近在学习c,话说从java转向c真的蛮痛苦。Anyway,学习就是一份好经历。

看到如下一段code:

#define APP_TOOL_OP_TYPES(f)                  \
   f(SIMPLE, "simple", FALSE)                   \
   f(JSON,   "json",   TRUE)                    \
   f(PYTHON, "python", TRUE)                    \


typedef enum {
   APP_TOOL_OP_INVALID,
#define DEFINE_OP_TYPE(_x, _y, _z) APP_TOOL_OP_##_x,
   APP_TOOL_OP_TYPES(DEFINE_OP_TYPE)
#undef DEFINE_OP_TYPE
   APP_TOOL_OP_MAX_INVALID
} APPToolOutputFmt;


在下不才一开始没理解,看了一会儿才明白,经过两次替换后,上面的枚举类型其实等价于


typedef enum {
APP_TOOL_OP_INVALID,
APP_TOOL_OP_SIMPLE,
APP_TOOL_OP_JSON,
APP_TOOL_OP_PYTHON,
APP_TOOL_OP_MAX_INVALID
}APPToolOutputFmt;




还有,为什么作者要设计成包括INVALID和MAX_INVALID两个值呢,读他后面的代码发现这在遍历这个枚举变量所有值时候特别有用,只需要一个for循环for(int a = APP_TOOL_OP_INVALID;a<APP_TOOL_OP_MAX_INVALID;a++)就可以了!(注意c里面枚举缺省从0开始赋值。)

还有,关于两个#和一个#在宏里面分别表示什么意思呢?
两个#表示连接,比如,APP_TOOL_OP_##_x表示APP_TOOL_OP_和参数SIMPLE连接成APP_TOOL_OP_SIMPLE。具体见
http://gcc.gnu.org/onlinedocs/cpp/Concatenation.html#Concatenation

一个#表示取字符串,比如#APP就是表示取“APP”这个字符串,详见
http://gcc.gnu.org/onlinedocs/cpp/Stringification.html#Stringification
分享到:
评论

相关推荐

    《你必须知道的495个C语言问题》

    *2.5 在C语言中是否有模拟继承等面向对象程序设计特性的好方法? 22 2.6 为什么声明extern f(struct x *p); 给我报了一个晦涩难懂的警告信息? 23 2.7 我遇到这样声明结构的代码:struct name {int namelen; ...

    CPIA: XML Macro Processing in C-开源

    CPIA是用C编写的XML(和HTML)宏处理引擎。该引擎既可以脱机用作处理器,也可以在Web服务器内部使用。 两家开发商都失去了兴趣。 如果您有兴趣维护它,请联系任一管理员。

    Rust 中 Python 式理解的宏

    可爱的Rust 中 Python 式列表推导式的宏。c!...例子简单理解#[macro_use(c)]externcrate cute;let v= [1 ,2 ,3 ,4 ];let v_squared=c! [x* x,for xin v];条件过滤let squares=c! [x* x,for xin0 ..1

    大机汇编宏代码展开

    line 2 : meet:MACRO, GOTO:3 given paras : [('FUNC', '', 'KEY_PARA'), ('AREAPTR', '', 'KEY_PARA'), ('DCB', '', 'KEY_PARA'), ('MF', 'L', 'KEY_PARA')] paras in macro prototype: [('MF', 'S', 'KEY_PARA'), ...

    freemarker总结

    &lt;#assign mail="jsmith@other.com" in my&gt; ${my.mail} l 输出结果: jsmith@acme.com jsmith@other.com l 数据模型中的变量任何地方都可见,也包括不同的名字空间,下面是修改的库: &lt;#macro copyright...

    MASM64 SDK宏汇编

    I recommend you extract or the let the program extract to \Masm...*converted .inc's from the masm32 package(I wrote a tool that converted to galops funcproto macro which I renamed to proto64 for example

    LAMAlib:cc65的轻量级汇编程序MAcro库

    拉玛利卜cc65的轻量级汇编程序MAcro库包含用于16位操作和更容易的屏幕输出的宏,例如: .include "LAMAlib.inc" ; include LAMAlib macros ; this does not add extra code unless you use a functionldax #$1234 ; ...

    MSDEV.EXE-应用程序错误解决办法.

    重新打开VC6,Tools-&gt;Customize-&gt;Add-ins and Macro Files,选中FileTool Developer Studio Add-in即可。 此时打开VC6会有一个浮动工具栏(A O),点击A就是添加文件到工程,点击O就是打开文件。是不是很怪啊,竟然...

    freemarker语法完整版

    Freemarker页面语法 ... 类似于java里的import,它导入文件,然后就可以在当前文件里使用被导入文件里的宏组件 用例 假设mylib.ftl 里定义了宏copyright 那么我们在其他模板页面里可以这样使用 Freemarker代码 ...

    make和Makefile详解 一起写Makefile

     Make [flags] [macro definitions] [targets]  Unix系统下标志位flags选项及其含义为:  -f file 指定file文件为描述文件,如果file参数为"-"符,那么描述文件指向标准输入。如果没有"-f"参数,则系统将默认...

    Mapping-FDCs-in-GCs:JC Anania等人在2020年免疫学前沿中使用的宏一种新颖的图像分析方法揭示了补体受体1和2在生发中心的滤泡树突状细胞组织中的作用

    在GC中映射FDC JC Anania等人在2020年免疫学前沿中使用的宏一种新颖的图像分析方法揭示了补体受体...//文件位置= C:/ Users / jessa / Desktop / GC Zone Macro / //保存位置= C:/ Users / jessa / Desktop / GC Zon

    QAC工具介绍和使用说明(供一种可量化措施的代码度量值属性:33基于功能 32基于文件和4个项目级别)

    在System Macro Defines下的Project Macros菜单中,设置宏同编译器或开发环境一致,宏可以在Compiler Personality或Analyser Personality设置 3.1.3、设置实现定义的类型 在c编译器里有3中类型定义,在...

    asm 汇编语言基础知识

    INC SI LOOP X3 MOV W,BX RET DATACATE ENDP IFYEARS PROC NEAR PUSH BX PUSH CX PUSH DX MOV AX,W MOV CX,AX MOV DX,0 MOV BX,4 DIV BX CMP DX,0 JNZ LAB1 MOV AX,CX MOV BX,100 DIV BX CMP DX...

    VC代码示例及说明,代码片段,自己总结和来自网上

    2、Macro 35 3、宏的用法 36 四、MFC: 41 1、getMousePosition 41 2、Access to CMainFrame 41 3、Deleting item in a CObList 42 4、Traversing CObList 42 5、 Set indicator text 42 6、 How do I dynamically ...

    Visual C++ 编程资源大全(英文源码 其它)

    13.zip Autoincreasing build number 自动增加版本信息的宏(5KB)&lt;END&gt;&lt;br&gt;14,14.zip File Dialog Macro 文件对话框宏(6KB)&lt;END&gt;&lt;br&gt;15,15.zip Code Template add-in for Visual C++ 5.0 在VC5中可...

    pfr:std :: tuple类似用户定义类型的方法,没有任何宏或样板代码

    增强PFR 这是一个C ++ 14库,用于非常基本的反射,使您可以按索引访问结构元素,并为用户定义的类型提供其他std::tuple类的方法,而无需任何宏或样板代码。检测结果分行建立测试覆盖率更多信息开发: 主: 激励实例...

    [原创]自己工作中常用的模板库,简化你的工作

    ☆ if only one number is different in multiple statements, can use one macro loop to simplify them (one macro statement) usage refer to unit test. ◆ [mathOperator.hpp] ★ 泛型的数学操作符。"equal/...

    cmd操作命令和linux命令大全收集

    它在 Windows NT/2000/XP 中均可使用,但在 Windows 98 中却没有集成这一个工具。 4. explorer-------打开资源管理器 5. logoff---------注销命令 6. shutdown-------60秒倒计时关机命令 7. lusrmgr.msc----本机...

    汇编课程设计四则运算

    INC WORD PTR SIGN1 ;将数字标志位加一 SUB AL,30H ;将asc码转16进制 MOV AH,0 ; XCHG AX,[DI] ; MOV BX,10 ; MUL BX ; XCHG AX,[DI] ; ADD [DI],AX ; JMP INPUT ; PD: CMP WORD PTR SIGN2,0 ;判断配对...

Global site tag (gtag.js) - Google Analytics