2012-03-01 86 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到處出現。