这是什么定义声明?

问题描述 投票:0回答:6

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

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

c c-preprocessor
6个回答
4
投票

[如果您想查看处理后的结果是什么,只需问一下即可,使用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

替换为文字字符串,并替换为其值

2
投票

这就是所谓的“ X宏”,它是关于制作任何类型的常量的列表,并将该列表的维护集中到源代码中的单个位置,以避免代码重复。以可读性为代价。


1
投票
enum mxt_object_type {
  T0 = 0,
  T1 = 1,
  T2 = 2,
  T3 = 3,
  T4 = 4,
  T5 = 5,
};

0
投票

嗯,如果您将该代码预处理为文件,则会得到:


0
投票

它使用宏定义来定义另一个枚举类型。 F_ENUM是一个宏,用于定义枚举中的每个项目。 F_SWICH是将在switch语句中使用的宏。此技术用于避免重复代码


0
投票

如果您添加这样的代码

© www.soinside.com 2019 - 2024. All rights reserved.