加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

带内存的C宏

发布时间:2020-12-16 06:59:03 所属栏目:百科 来源:网络整理
导读:这最初是作为 c++ macros with memory?的答案发布的 但不知怎的,我无法得到这个编译.我可能会在这里遗漏一些东西. (我觉得这是C可以做的事情) main.cpp中 #include iostreamusing namespace std;const char * hello = "hello";const char * world = "world";
这最初是作为 c++ macros with memory?的答案发布的

但不知怎的,我无法得到这个编译.我可能会在这里遗漏一些东西. (我觉得这是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

我真的想让这个记忆在预处理阶段起作用.有人可以帮忙吗?我认为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;
}

memorize.h:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读