Когда вы хотите увидеть результат после обработки, просто попросите его посмотреть, с 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 в буквальную строку после ее подстановки ее значением