【问题标题】:C++ Macro Not Working [closed]C ++宏不起作用[关闭]
【发布时间】:2014-12-04 17:42:24
【问题描述】:

我定义的宏函数似乎不起作用。

main.cpp:22:3:错误:未知类型名称“a”
a *app = 新的 a;
^
main.cpp:22:16:错误:未知类型名称“a”
a *app = 新的 a;
^

这里有更多源代码:

#include <iostream>

#include "monster.h"
#define DECLARE_MAIN(a)

class game : public monster::app {
  void init()
  {
  }
  void startup()
  {
  }
  void render(double currentTime)
  {
  }
};

DECLARE_MAIN(game)

int main(int argc, const char ** argv)
{
  a *app = new a;
  app->run(app);
  delete app;
  return 0;
}

如果我不使用宏就没有问题

int main(int argc, const char ** argv)
{
  game *app = new game;
  app->run(app);
  delete app;
  return 0;
}

如何使用这个宏?

更新

我认为这是我对宏的工作原理以及我复​​制的来源缺乏了解。 我没有意识到下面的函数是宏的一部分。

#define DECLARE_MAIN(a)                             \
int main(int argc, const char ** argv)              \
{                                                   \
    a *app = new a;                                 \
    app->run(app);                                  \
    delete app;                                     \
    return 0;                                       \
}

【问题讨论】:

  • 好吧,我没有看到 a 类型的声明,所以听听你的编译器吧。
  • 我不知道你希望那个宏做什么,但它实际上并没有做任何事情。
  • 也许您会发现 preprocessing your source 会有所帮助。
  • 您实际上认为#define DECLARE_MAIN(a) 应该扩展到什么?根本没有为该宏定义任何文本。
  • 我们不知道您要做什么。您已经定义了一个名为 DECLARE_MAIN 的宏,该宏扩展为空。您似乎希望这会将“a”更改为“游戏”

标签: c++ macros


【解决方案1】:

我怀疑您正在尝试将宏用作typedef

看起来你的意思是:

typedef game a;

那你就可以做这行了:

a* 应用程序 = 新的 a;

【讨论】:

    【解决方案2】:

    将您的宏定义为:

    #define DECLARE_MAIN(a) \
    do {\
        a *app = new a; \
        app->run(app);\
        delete app;\
    } while (0)
    

    不用写int main,你只需写:

    在 main 中,你可以:

    int main(int argc, char **argv) {
        DECLARE_MAIN(game);
        return 0;
    }
    

    【讨论】:

    • 这个宏吓到我了。
    • 是的,任何封装函数的宏都应该会吓到任何人。但我认为这就是 OP 的目标
    • @Smac89 你不可能是对的。您只能调用该宏一次。即使您确实想这样做,typedef 也是一个更好的解决方案。
    • @JonathanMee, ok 我刚刚回忆了一下main函数是整个程序的入口点,所以我提出了一个新的解决方案,不那么吓人,但仍然使用宏
    • @Smac89 编辑后更好,因为它可能是可重复使用的?但仍然无法调试。 typedef 仍然是一个更可取的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多