2012-03-01 90 views
4

宏这是最初发布的回答为c++ macros with memory?C++与记忆

但不知何故,我不能够得到这个编译。我可能会在这里错过一些东西。 (我有一种感觉,这是一件C++可以做)

的main.cpp

#include <iostream> 
using namespace std; 

const char * hello = "hello"; 
const char * world = "world"; 

#define VAR 

#define MEMORIZE world 
#include "memorize.h" 
#define MEMORIZE hello 
#include "memorize.h" 

int main() { 
    cout << VAR << endl; 
    return 0; 
} 

memorize.h

#undef VAR 
#ifndef MEMORIZE 
    # error "No Argument to memorize.h" 
#endif 
#define VAR MEMORIZE 
#undef MEMORIZE 

,我得到的编译错误是这样的:

[100%] Building CXX object CMakeFiles/main.dir/main.cpp.o 
error: use of undeclared identifier 'MEMORIZE' 
    cout << VAR << endl; 
      ^
note: instantiated from: 
#define VAR MEMORIZE 
      ^
1 error generated. 
make[2]: *** [CMakeFiles/main.dir/main.cpp.o] Error 1 
make[1]: *** [CMakeFiles/main.dir/all] Error 2 
make: *** [all] Error 2 

我真的想让这个记忆的东西在预处理阶段工作。有人可以帮忙吗?我认为BOOST_PP_COUNTER1.49也使用这种技术,但我无法弄清楚如何。

+6

我希望这是一种自虐的娱乐,而不是生产代码。 :-D – stinky472 2012-03-02 00:06:04

+0

好吧,目前它不编译... 即使我想把它放在更广泛的用途,我不能:P – 2012-03-02 00:11:17

回答

1

您仅使用一个VAR值(最后一个值),因为它只能使用一个值。如果你想根据上下文的不同意见VAR,你需要在每个包含之后都有源语句。

#define xstr(a) str(a) 
#define str(a) #a 
int main() { 
#define MEMORIZE world 
#include "memorize.h" 
     cout << VAR << endl; 
#undef MEMORIZE 
#define MEMORIZE hello 
#include "memorize.h" 
     cout << VAR << endl; 
      return 0; 
} 

memorize.h:

#undef VAR 
#ifndef MEMORIZE 
    # error "No Argument to memorize.h" 
#endif 
#define VAR xstr(MEMORIZE) 
+0

ref:http://stackoverflow.com/a/2653351/390913 – perreal 2012-03-02 00:35:23

+0

我不认为我想要的是可能的。我会接受你的答案,因为它非常有教育意义。 – 2012-03-03 00:16:07

0

您正在将VAR宏设置为标记MEMORIZE,您很快就会对其进行定义。行:

cout << VAR << endl; 

为结束:

cout << MEMORIZE << endl; 

而且由于MEMORIZE是未申报的,你的错误。它认为MEMORIZE是一个变量名。

+0

你是否建议这不是可以做的事情?我只是想知道BOOST_PP_COUNTER是如何工作的? http://www.boost.org/doc/libs/1_49_0/libs/preprocessor/doc/index.html – 2012-03-02 00:20:50

+0

如果可以做到,我不知道如何。一个更好,更简单,更标准的解决方案是在使用它之前定义一个具有一定价值的宏,并且您可以在任何地方“重新定义”它。 – 2012-03-02 00:25:20

+0

我看着boost源代码,并且(来自可能不准确的代码片段)看起来像是使用if(counter == 0){counter = 1} else if(counter == 1){counter = 2} ...'样式代码,除了使用数字操作来启用具有次指数代码大小的多位数字。某处有一位程序员脑部受损。 – 2012-03-02 00:41:42

0

你需要移动#undef MEMORIZE线 - 取出memorize.h,并把它的权利之前#define MEMORIZE到处出现。