【问题标题】:C++ Macro with Memory带内存的 C++ 宏
【发布时间】:2012-03-01 23:57:56
【问题描述】:

这最初是作为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 也使用了这种技术,但我不知道如何。

【问题讨论】:

  • 我希望这是为了某种自虐娱乐而不是生产代码。 :-D
  • 好吧,目前它没有编译......即使我想把它用于更广泛的用途,我也不能:P

标签: c++ boost c-preprocessor


【解决方案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)

【讨论】:

  • 我不认为我的意图是可能的。我会接受你的回答,因为它很有教育意义。
【解决方案2】:

您正在将VAR 宏设置为令牌MEMORIZE,您将立即取消定义。行:

cout << VAR << endl;

最后是:

cout << MEMORIZE << endl;

并且由于 MEMORIZE 未声明,因此您会收到错误消息。它认为MEMORIZE 是一个变量名。

【讨论】:

  • 你是说这不是可以做的吗?我只是想知道 BOOST_PP_COUNTER 是如何工作的? boost.org/doc/libs/1_49_0/libs/preprocessor/doc/index.html
  • 如果可以,我不知道怎么做。一个更好、更简单、更标准的解决方案是在使用之前定义一个宏,使其具有一定的值,然后你可以在任何你喜欢的地方“重新定义”它。
  • 我查看了 boost 源代码,并且(从可能不准确的代码略读)看起来他们使用 if (counter == 0) { counter = 1 } else if (counter == 1) { counter = 2 } ... 样式代码,除了数字操作以启用具有次指数代码的多位数字尺寸。某处有一个脑残的程序员。
  • 我认为现在只使用一个变量可能是不可能的。
【解决方案3】:

您需要移动#undef MEMORIZE 行——将其从memorize.h 中取出并放在#define MEMORIZE 之前出现的任何位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    相关资源
    最近更新 更多