C++ 使用#pragma message()在编译期间打印#define的完全评估结果

C++ 使用#pragma message()在编译期间打印#define的完全评估结果,c++,visual-c++,c-preprocessor,pragma,C++,Visual C++,C Preprocessor,Pragma,我有一个关于使用pragma消息打印#defines的评估值的快速问题。我正在VisualStudio2008中使用msvc++ 下面是一个简化的示例: #define __STR2__(x) #x #define __STR1__(x) __STR2__(x) #define WIDTH 10 #define HEIGHT 10 #define AREA (WIDTH * HEIGHT) #pragma message("Area is: " __STR1__(AR

我有一个关于使用pragma消息打印#defines的评估值的快速问题。我正在VisualStudio2008中使用msvc++

下面是一个简化的示例:

#define __STR2__(x) #x
#define __STR1__(x) __STR2__(x)

#define WIDTH     10
#define HEIGHT    10
#define AREA      (WIDTH * HEIGHT)

#pragma message("Area is: " __STR1__(AREA))
现在,当我编译时,我得到以下输出:

>Area is: (10 * 10)
这不是我想要的。有没有办法打印出#define表达式的求值结果,以便我得到:

>Area is: 100
在汇编期间。也许这是不可能的。最后,如果计算值太大,我希望能够导致编译器错误。i、 e

#if(AREA > 1000)
#pragma message(__ERROR__)
#endif
我的一些#defines use
sizeof()
,我相信这会在计算条件时引起问题,但这是未来的问题


我看了下面的帖子,只要
#define
被定义为一个值,而不是其他定义的串联,就可以了。

预处理器不会为您计算,它只能以文本方式替换标记和扩展宏

如果要在编译过程中计算该值,则应选择
constexpr
(,更准确地说,这将提示编译器在编译时计算该值)

#包括
#定义宽度10
#定义高度10
模板
constexpr int getArea(){
静态(a*b<1000,“面积太大”);
返回a*b;
}
const int area=getArea();
内部主(空){

std::cout预编译器可以在
#if
语句中进行有限的运算。这可能足以满足您的需要:

#define WIDTH     10
#define HEIGHT    10
#define AREA      (WIDTH * HEIGHT)
#if AREA > 1000
#error Oh bad, oh bad, oh bad
#endif
对于更复杂的数学,我会附议,但你不需要在模板或任何东西中。 你可以把它放在你所有的
#define
上,例如:

#define WIDTH     10
#define HEIGHT    10
#define AREA      (WIDTH * HEIGHT)
#define __ERROR__ "Oh bad, oh bad, oh bad"
static_assert(AREA < 1000, __ERROR__);
#定义宽度10
#定义高度10
#定义面积(宽度*高度)
#定义错误“糟糕,糟糕,糟糕”
静态断言(面积<1000,错误);

或者更简单一点:
static_assert(WIDTH*HEIGHT<1000,“噢,糟糕,糟糕,糟糕”);

谢谢Marco。我相信这种方法在评估区域是否太大方面是有效的,即使宏包含sizeof()语句,但我认为它不允许我在编译过程中打印出'Area'的值?或者可能我遗漏了什么。正如您所说,预处理器只能输出字符串。@user3581793如果不满足条件,这将在编译时打印。您是指在编译时打印一些内容,然后让编译继续进行吗这是一个不同的问题,有一些“黑客”为此:。我不建议这样做。是的,我认为是这样。本质上,我希望打印出'Area'的值,而不管它是否满足太大的条件。因此,如果该值小于1000,它将打印出来,例如
Area为900
,编译将继续。如果Area需要,Assert将停止编译o大型。而且它看起来像是
static\u assert()
只是较新的C++11标准的一部分,我不能在这个项目中使用它。
#define WIDTH     10
#define HEIGHT    10
#define AREA      (WIDTH * HEIGHT)
#define __ERROR__ "Oh bad, oh bad, oh bad"
static_assert(AREA < 1000, __ERROR__);