【问题标题】:Can I use #define directive with :: ? Why it doesn't work?我可以将 #define 指令与 :: 一起使用吗?为什么它不起作用?
【发布时间】:2014-10-23 16:19:35
【问题描述】:

我写了一个 B 类作为 A 的子类来扩展它。现在我想改变所有的

 a = A::create(); 

 a = (A*)B::create(); 

一切正常。但我不想在创建 A 对象的任何地方手动更改代码。 所以我尝试了以下#define指令

#define A::create (A*)B::create

但它根本不起作用。 我不知道问题是什么。有什么帮助吗?我可以将 #define 指令与 :: 一起使用吗?为什么它不起作用?

【问题讨论】:

  • 假设B 确实是A 的子类并且B::create() 返回B*,则您不需要演员表。如果代码需要更改,您真的应该更改代码,而不是让未来的调试器想知道为什么 A::create 会做其他事情而不是创建 A
  • 我强烈建议不要尝试以这种方式解决问题 - 如果您需要在任何地方更改代码,最好直接在任何地方更改代码或找到某种方法来引入另一个级别的间接性。
  • 如果对A::create每个 调用都必须更改,为什么不直接更改A::create 所做的呢?在任何情况下,都要避免 C 风格的强制转换。
  • 如果BA 的派生类型,并且如果B::create() 返回B*,那么你甚至不需要强制转换——从指针到派生的转换指向基址的指针是隐含的。

标签: c++


【解决方案1】:

问题很简单,就是不能在宏名称中使用这些字符;它们是不允许的,因为标准规定它们是不允许的。

宏名称只能包含字母(大写和小写)、下划线和数字。 (此外,它们不能以数字开头,并且以下划线后跟大写字母开头的宏和标识符名称保留供编译器和标准库使用。)

如果您使用冒号和括号等其他字符,那么您只是没有有效的宏名称。

进一步阅读:

【讨论】:

    【解决方案2】:

    宏名称必须是单个标识符。 A::create 是一个标识符,后跟一个冒号标记,然后是另一个标识符。所以它不能识别你的语法。

    除此之外,你正在做的是一个非常非常糟糕的主意。请改用支持正则表达式的搜索和替换。

    【讨论】:

    • 你需要更多的真的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 2023-03-03
    • 2010-09-12
    • 2018-09-22
    相关资源
    最近更新 更多