最近在学习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语言作为一门通用编程语言,自20世纪70年代初由丹尼斯·里奇(Dennis Ritchie)在贝尔实验室开发以来,一直因其高效性、灵活性和可移植性而受到广泛欢迎...
C语言中常见编译错误信息 C语言中常见编译错误信息可以分为三类:致命错误、一般错误和警告。下面将对这三类错误信息进行详细的解释和分析。 致命错误包括Bad call of in-line function、Irreducible expression ...
### C语言常见错误中英文对照表解析 #### 1. **致命错误 (Fatal Errors)** - **`fatal error C1003: error count exceeds number; stopping compilation`** - **中文对照**: 错误太多,停止编译。 - **分析**: ...
根据给定文件中的标题、描述、标签以及部分内容,本文将对C语言中常见的错误信息进行中文解释,并提供相应的解决办法。 ### 1. #operator not followed by macro argument name 错误信息:“`#`操作符后面没有宏...
### C语言常见错误中英文对照表解析 #### 1. 错误太多,停止编译 (fatal error C1003) **英文**: `fatal error C1003: error count exceeds number; stopping` **中文**: 错误太多,停止编译 **分析**: 当编译器...
2. **丰富的库文件**:用户提到在该版本中包含了大量的inc和lib文件,这些文件提供了预定义的函数和常量,大大简化了编程过程。inc文件通常包含头文件,包含常量定义、类型声明等;lib文件则是链接库,其中封装了...
这本书由SAS Institute Inc.出版,包含了硬拷贝、EPUB、MOBI和PDF等多种格式的版本,每个版本都有其特定的ISBN号码,确保了版权的合法性和用户获取的合法性。 SAS宏语言是SAS系统中的一个强大工具,它允许用户编写...
“irvine32.inc”是一个包含宏定义和函数声明的头文件,它为Masm(Microsoft Macro Assembler)提供了一套方便的函数库接口。这个文件包含了Irvine32库中的各种实用函数,这些函数可以帮助开发者编写更简洁、更易于...
在C语言编程中,开发者经常会遇到各种错误,这些错误可能会阻碍程序的编译和执行。以下是一些常见的C语言编译错误及其分析: 1. `fatal error C1003: error count exceeds number; stopping compilation` 这个错误...
例如,“#operator not followed by macro argument name”表明在宏定义中,运算符后面没有跟上宏变量名,需要检查宏定义的语法。"’xxxxxx’ not an argument"说明标识符被定义为函数参数,但在函数表中未出现,...
- **#operator not followed by macro argument name**:在宏定义中,`#`运算符用于将宏参数转换为字符串,如果后面没有跟随宏参数名,就会引发错误。确保`#`后面有正确的宏参数。 - **‘xxxxxxxx’ not an ...
Verilog宏类似于C语言中的宏定义,可以在编译阶段进行文本替换。宏定义通过`define关键字开始,如`define MY_MACRO VALUE,然后在代码中使用MY_MACRO时,编译器会将其替换为(VALUE)。这在处理重复的代码块或设置参数...
C语言程序编译常见错误对照是指在C语言程序编译过程中可能出现的错误类型及其对照描述。本文将详细介绍C语言程序编译常见错误对照,帮助开发者快速定位和解决编译错误。 1. fatal error C1003: error count exceeds...
例如,`#operator not followed by macro argument name`意味着在宏定义中`#`后面缺少宏参数名;`'xxxxxxxx' not an argument`表示标识符被误用为函数参数但未出现在参数列表中;`Ambiguous symbol 'xxxxxxxx'`提示...
在学习C语言的过程中,初学者可能会遇到各种各样的错误提示,这些错误通常是由于语法错误、类型不匹配、逻辑问题或编译器限制导致的。以下是对这些常见错误的详细解释和解决策略: 1. **Ambiguous operators need ...
- **INC CL** 和 **CMP CL, 9**:增加个位数,并检查是否达到最大值9。 - **INC CH** 和 **CMP CH, 9**:增加十位数,并检查是否达到最大值9。 通过以上分析可以看出,这段代码不仅展示了如何使用宏定义简化重复...
在C与C++编程语言的学习和实践中,遇到各种编译错误是在所难免的。下面将对给定文件中提到的一些常见的C与C++错误进行详细解释,并提供中英文对照,帮助开发者更好地理解并解决这些问题。 ### 1. fatal error C1003...
### C语言中的常见错误 C语言作为一种广泛应用的编程语言,其语法严谨且功能强大,但同时也容易出现各种错误。本文将根据提供的文件信息,详细解释其中提到的一些C语言中的常见错误,帮助读者更好地理解并避免这些...
# operator not followed by macro argument name (#运算符后没跟宏变元名)** - **错误描述**:在宏定义中使用`#`标识符来表示字符串化宏参数时,后面没有跟随宏参数名。 - **解决方法**: - 确保`#`后面紧跟宏...