在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
^
有没有办法比较两个宏而不会产生错误?
答案 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