`
standalone
  • 浏览: 611061 次
  • 性别: 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
分享到:
评论

相关推荐

    优化秘籍:C语言预处理器宏的高级应用

    ### 优化秘籍:C语言预处理器宏的高级应用 #### C语言简介 C语言作为一门通用编程语言,自20世纪70年代初由丹尼斯·里奇(Dennis Ritchie)在贝尔实验室开发以来,一直因其高效性、灵活性和可移植性而受到广泛欢迎...

    c语言中常见编译错误信息

    C语言中常见编译错误信息 C语言中常见编译错误信息可以分为三类:致命错误、一般错误和警告。下面将对这三类错误信息进行详细的解释和分析。 致命错误包括Bad call of in-line function、Irreducible expression ...

    C语言常见错误中英文对照表

    ### C语言常见错误中英文对照表解析 #### 1. **致命错误 (Fatal Errors)** - **`fatal error C1003: error count exceeds number; stopping compilation`** - **中文对照**: 错误太多,停止编译。 - **分析**: ...

    C语言错误信息中文解释

    根据给定文件中的标题、描述、标签以及部分内容,本文将对C语言中常见的错误信息进行中文解释,并提供相应的解决办法。 ### 1. #operator not followed by macro argument name 错误信息:“`#`操作符后面没有宏...

    C语言实验\C语言常见错误中英文对照表

    ### C语言常见错误中英文对照表解析 #### 1. 错误太多,停止编译 (fatal error C1003) **英文**: `fatal error C1003: error count exceeds number; stopping` **中文**: 错误太多,停止编译 **分析**: 当编译器...

    Microsoft Macro Assembler v6.15

    2. **丰富的库文件**:用户提到在该版本中包含了大量的inc和lib文件,这些文件提供了预定义的函数和常量,大大简化了编程过程。inc文件通常包含头文件,包含常量定义、类型声明等;lib文件则是链接库,其中封装了...

    Carpenter's Complete Guide to the SAS Macro Language

    这本书由SAS Institute Inc.出版,包含了硬拷贝、EPUB、MOBI和PDF等多种格式的版本,每个版本都有其特定的ISBN号码,确保了版权的合法性和用户获取的合法性。 SAS宏语言是SAS系统中的一个强大工具,它允许用户编写...

    irvine32.inc 和irvine32.lib

    “irvine32.inc”是一个包含宏定义和函数声明的头文件,它为Masm(Microsoft Macro Assembler)提供了一套方便的函数库接口。这个文件包含了Irvine32库中的各种实用函数,这些函数可以帮助开发者编写更简洁、更易于...

    计算机C语言常见错误分析中英文对照表

    在C语言编程中,开发者经常会遇到各种错误,这些错误可能会阻碍程序的编译和执行。以下是一些常见的C语言编译错误及其分析: 1. `fatal error C1003: error count exceeds number; stopping compilation` 这个错误...

    c语言源程序常见错误分类及其改错

    例如,“#operator not followed by macro argument name”表明在宏定义中,运算符后面没有跟上宏变量名,需要检查宏定义的语法。"’xxxxxx’ not an argument"说明标识符被定义为函数参数,但在函数表中未出现,...

    c语言

    - **#operator not followed by macro argument name**:在宏定义中,`#`运算符用于将宏参数转换为字符串,如果后面没有跟随宏参数名,就会引发错误。确保`#`后面有正确的宏参数。 - **‘xxxxxxxx’ not an ...

    宏模块调用方法与应用实例.rar_verilog_verilog 宏依赖

    Verilog宏类似于C语言中的宏定义,可以在编译阶段进行文本替换。宏定义通过`define关键字开始,如`define MY_MACRO VALUE,然后在代码中使用MY_MACRO时,编译器会将其替换为(VALUE)。这在处理重复的代码块或设置参数...

    (完整word版)C语言程序编译常见错误对照.doc

    C语言程序编译常见错误对照是指在C语言程序编译过程中可能出现的错误类型及其对照描述。本文将详细介绍C语言程序编译常见错误对照,帮助开发者快速定位和解决编译错误。 1. fatal error C1003: error count exceeds...

    C语言 编译出错信息一览表

    例如,`#operator not followed by macro argument name`意味着在宏定义中`#`后面缺少宏参数名;`'xxxxxxxx' not an argument`表示标识符被误用为函数参数但未出现在参数列表中;`Ambiguous symbol 'xxxxxxxx'`提示...

    C语言常见提示信息(很全面,很经典)

    在学习C语言的过程中,初学者可能会遇到各种各样的错误提示,这些错误通常是由于语法错误、类型不匹配、逻辑问题或编译器限制导致的。以下是对这些常见错误的详细解释和解决策略: 1. **Ambiguous operators need ...

    汇编语言的宏定义方法

    - **INC CL** 和 **CMP CL, 9**:增加个位数,并检查是否达到最大值9。 - **INC CH** 和 **CMP CH, 9**:增加十位数,并检查是否达到最大值9。 通过以上分析可以看出,这段代码不仅展示了如何使用宏定义简化重复...

    C与C++常见错误中英文对照

    在C与C++编程语言的学习和实践中,遇到各种编译错误是在所难免的。下面将对给定文件中提到的一些常见的C与C++错误进行详细解释,并提供中英文对照,帮助开发者更好地理解并解决这些问题。 ### 1. fatal error C1003...

    C语言的错误小集 C语言的错误

    ### C语言中的常见错误 C语言作为一种广泛应用的编程语言,其语法严谨且功能强大,但同时也容易出现各种错误。本文将根据提供的文件信息,详细解释其中提到的一些C语言中的常见错误,帮助读者更好地理解并避免这些...

    C语言常见编辑错误信息表

    # operator not followed by macro argument name (#运算符后没跟宏变元名)** - **错误描述**:在宏定义中使用`#`标识符来表示字符串化宏参数时,后面没有跟随宏参数名。 - **解决方法**: - 确保`#`后面紧跟宏...

Global site tag (gtag.js) - Google Analytics