比较包含括号的宏

时间:2015-09-02 22:37:11

标签: c macros c-preprocessor

在cygwin的sys/time.c文件中,它定义了以下内容:

#define CLOCK_REALTIME (clockid_t)1
#define CLOCK_PROCESS_CPUTIME_ID (clockid_t)2
#define CLOCK_THREAD_CPUTIME_ID (clockid_t)3
#define CLOCK_MONOTONIC (clockid_t)4

我正在尝试编译的程序定义了上述宏中的宏...

/* make sure we have a best effort CUSTOM_CLOCK_MONOTONIC we can rely on */
#if defined(CLOCK_MONOTONIC)
#define CUSTOM_CLOCK_MONOTONIC CLOCK_MONOTONIC
#elif defined(CLOCK_HIGHRES)
#define CUSTOM_CLOCK_MONOTONIC CLOCK_HIGHRES
#else
#define CUSTOM_CLOCK_MONOTONIC CLOCK_REALTIME
#endif

稍后检查自定义宏是否等于另一个宏...

#if CUSTOM_CLOCK_MONOTONIC != CLOCK_REALTIME
    if (clock_gettime(CUSTOM_CLOCK_MONOTONIC,tp) == 0) {
        return;
    }
#endif

但是,由于宏中定义了括号,因此GCC编译器无法成功处理它们,从而产生错误:

test.c: In function 'main':
test.c:4:36: error: missing binary operator before token "4"
 #define CLOCK_MONOTONIC (clockid_t)4
                                    ^
test.c:7:32: note: in expansion of macro 'CLOCK_MONOTONIC'
 #define CUSTOM_CLOCK_MONOTONIC CLOCK_MONOTONIC
                                ^
test.c:16:5: note: in expansion of macro 'CUSTOM_CLOCK_MONOTONIC'
 #if CUSTOM_CLOCK_MONOTONIC != CLOCK_REALTIME
     ^

有没有办法比较两个宏而不会产生错误?

2 个答案:

答案 0 :(得分:1)

在这种情况下,您只需更改:

stor_begin

end

如果所有现代编译器中的不等式都是假的,那么代码也将被优化掉。

答案 1 :(得分:0)

无法测试是否将宏定义到某个其他特定宏。如果您需要此功能,则必须记住'使用另一个宏。例如:

#if defined(CLOCK_MONOTONIC)
#define CUSTOM_CLOCK_MONOTONIC CLOCK_MONOTONIC
#define CUSTOM_CLOCK_IS_MONOTONIC
#elif defined(CLOCK_HIGHRES)
#define CUSTOM_CLOCK_MONOTONIC CLOCK_HIGHRES
#define CUSTOM_CLOCK_IS_HIGHRES
#else
#define CUSTOM_CLOCK_MONOTONIC CLOCK_REALTIME
#define CUSTOM_CLOCK_IS_REALTIME
#endif

以后再测试

#ifndef CUSTOM_CLOCK_IS_REALTIME