带有内存的C++宏

C++ Macro with Memory

本文关键字:C++ 内存      更新时间:2023-10-16

这最初是作为带有内存的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;
}

记忆.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

我真的很想让这个内存在预处理阶段发挥作用。有人能帮忙吗?我认为1.49中的BOOST_PP_COUNTER也使用了这种技术,但我不知道如何使用。

您只使用一个VAR值(最后一个),因为它只能取一个值。如果您希望VAR根据上下文来表示不同的含义,则需要在每个include之后都有源语句。

#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;
}

记忆.h:

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

您正在将VAR宏设置为令牌MEMORIZE,并立即对其进行取消定义。线路:

cout << VAR << endl;

最终为:

cout << MEMORIZE << endl;

并且由于MEMORIZE是未声明的,所以您会得到错误。它认为MEMORIZE是一个变量名。

您需要移动#undef MEMORIZE行--将其从memory.h中取出,并将其放在出现的所有#define MEMORIZE之前。