c - 这是什么定义声明?
问题描述
我在应用程序中看到了这段代码,但我不认识它的语法。我必须在 C++ 中做一个等价的,但这段代码是在 C 中的。
如何让它在 C++ 应用程序中运行?这种定义的名称是什么?这与定义列表中的每个常量相同吗?
/*! Object types */
#define F_ENUM(x, y) x = y,
#define F_SWITCH(x, y) case x: return ( #x );
#define OB_LIST(f) \
f(T0, 0) \ //this declaration has no storage class or type specifier
//identifier "T0" is undefined
f(T1, 1) \ //expected a ")"
//unrecognized token
//expected a ";"
f(T2, 2) \
f(T3, 3) \
f(T4, 4) \
f(T5, 5)
enum mxt_object_type {
OB_LIST(F_ENUM)
};
此外,当我在 C++ 编译器中编译它时,会出现如下错误:
this declaration has no storage class or type specifier
identifier "T0" is undefined
expected a ")"
unrecognized token
expected a ";"
它们标记在代码上。这些错误是什么意思?
解决方案
当您想查看处理后的结果时,只需要求查看它,使用gcc / g++选项是-E
,如果我在您的代码上执行,结果是:
pi@raspberrypi:/tmp $ gcc -E d.c
# 1 "d.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "d.c"
# 13 "d.c"
enum mxt_object_type {
T0 = 0, T1 = 1, T2 = 2, T3 = 3, T4 = 4, T5 = 5,
};
当然这里F_SWITCH
没有用到
我必须在 C++ 中做一个等价的,但这段代码是在 C
您无事可做,在 C++ 中也是如此
这些宏是用于预处理器的,而不是用于 C 或 C++ 的,它们自己会看到我在开头显示的结果
C++ 编译示例:
pi@raspberrypi:/tmp $ cat d.cc
/*! Object types */
#define F_ENUM(x, y) x = y,
#define F_SWITCH(x, y) case x: return ( #x );
#define OB_LIST(f) \
f(T0, 0) \
f(T1, 1) \
f(T2, 2) \
f(T3, 3) \
f(T4, 4) \
f(T5, 5)
enum mxt_object_type {
OB_LIST(F_ENUM)
};
pi@raspberrypi:/tmp $ g++ -c -pedantic -Wall d.cc
pi@raspberrypi:/tmp $
这是如何工作的:
- 首先形式
OB_LIST(F_ENUM)
OB_LIST
是扩大生产F_ENUM(T0, 0) F_ENUM(T1, 1) F_ENUM(T2, 2) F_ENUM(T3, 3) F_ENUM(T4, 4) F_ENUM(T5, 5)
- 然后每个
F_ENUM
都被扩展产生最终结果T0 = 0, T1 = 1, T2 = 2, T3 = 3, T4 = 4, T5 = 5,
经典用法F_SWITCH
:
const char * nameIt(mxt_object_type v)
{
switch (v) {
OB_LIST(F_SWITCH)
default:
return "unknown";
}
}
产生:
const char * nameIt(mxt_object_type v)
{
switch (v) {
case T0: return ( "T0" ); case T1: return ( "T1" ); case T2: return ( "T2" ); case T3: return ( "T3" ); case T4: return ( "T4" ); case T5: return ( "T5" );
default:
return "unknown";
}
}
类似的字符串"T0"
是#x
由谁将x替换为其值后将其放入文字字符串中产生的
推荐阅读
- raku - 你如何生成随机令牌
- apache-spark - 为什么几个数据集在 Apache Spark 中有一个结构数组
- bash - 如何使用已知的基本密码暴力破解我自己的加密 .dmg
- azure - 如何永久删除 Azure DevOps 的工件中的提要?
- semantic-ui - 如何在关闭时删除模式的 DOM 元素
- time-complexity - 这个 O(N) 算法实际上是 O(logN) 吗?
- git - 使用版本控制跟踪 VS Code 配置的推荐方法是什么?
- python-multiprocessing - Pybind11 多处理挂起
- amazon-web-services - AWS Glue 数据目录有什么缺点?
- ruby-on-rails - Ruby on Rails 和 Oracle 游标。如何在光标内打开光标?