我如何根据宏观值做不同的事情?

时间:2011-09-29 04:35:20

标签: c macros

#define TYPE char *

if TYPE is char *
  do A
if TYPE is int
  do B

有没有一个例子如何做这些事情?

5 个答案:

答案 0 :(得分:2)

C预处理器MACROS操作文本,因此基本上没有类型,所以不,你不能这样做。

答案 1 :(得分:1)

您可以将另一个符号与其相关联:

#define TYPE char *
#define TYPE_IS_CHAR_STAR

#ifdef TYPE_IS_CHAR_STAR
...
#endif

您只需手动保持一致。

请注意,这是一个危险的宏;你应该使用typedef代替。随着宏:

TYPE x, y;

x是指针,但y不是。

答案 2 :(得分:0)

通过定义另一个宏以及类型,并使用#ifdef等与其他宏一起使用,可以获得类似的效果。例如:

#define TYPE char *
#define TYPE_IS_PCHAR 1

......然后......>

#ifdef TYPE_IS_PCHAR
   do A
#endif
#ifdef TYPE_IS_INT
   do B
#endif

这不是一回事,但它仍然让你在那里。

答案 3 :(得分:0)

不容易。你可以这样做:

#define TYPE_IS_CHARPTR
//#define TYPE_IS_INT

#ifdef TYPE_IS_CHARPTR
    do A
#endif
#ifdef TYPE_IS_INT
    do B
#endif

但你真的应该尽量减少使用预处理器来处理棘手的事情(除了简单的变量之外)。

使用枚举常量和内联函数,现在几乎不需要这样的用法。

答案 4 :(得分:0)

如果您只使用基本类型(因为它们只是字符串 - 请参阅Mitch的答案)。但是一旦你尝试使用指针,它将不再起作用 - 星号抛出预处理器进行循环:

[holt@Michaela ~]$ gcc test.c
test.c:3:10: error: operator '*' has no right operand

但是如果你想根据不同的类型做不同的事情,我将不得不建议切换到C ++并使用templatestemplate specialization。不情愿,因为模板语法难以置信,但你应该能够做任何你想做的事。

希望有所帮助!

相关问题