首页 > 解决方案 > 这是什么定义声明?

问题描述

我在应用程序中看到了这段代码,但我不认识它的语法。我必须在 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 ";"

它们标记在代码上。这些错误是什么意思?

标签: cc-preprocessor

解决方案


当您想查看处理后的结果时,只需要求查看它,使用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替换为其值后将其放入文字字符串中产生的


推荐阅读