用于将后缀附加到unsigned long long literal的宏

时间:2011-12-22 13:31:47

标签: c++ macros

我正在使用一个定义如下常量的库:

#define SOME_BIG_CONSTANT 0x0000000100000000

此文字太大而无法表示为long,因此任何使用此宏的程序都无法编译(使用gcc 4.1.2 for VxWorks)。 (非标准,但由此编译器支持)解决方案可以将后缀ull添加到文字中:

#define SOME_BIG_CONSTANT 0x0000000100000000ull

但是,这需要我修改库标题,我宁愿不这样做。我吮吸宏,所以我的问题是,如何定义一个可以添加该后缀的宏,我可以像这样调用:

ULL_(SOME_BIG_CONSTANT)

哪个会扩展为:

0x0000000100000000ull

2 个答案:

答案 0 :(得分:8)

ull 是C ++ 11上的标准后缀。

另一方面,您可以定义以下宏:

#define APPEND(x, y) x ## y
#define ULL(x) APPEND(x, ull)

现在,您可以使用:

int main()
{ 
  unsigned long long a = ULL(SOME_BIG_CONSTANT);

  return 0;
} 

答案 1 :(得分:3)

#define ULL_2(NUM) NUM ## ull
#define ULL_(NUM) ULL_2(NUM)

应该做的工作。 (注意:未经测试)

需要第二个宏来触发传递宏的宏扩展。