【问题标题】:Restoring definitions and macros恢复定义和宏
【发布时间】:2017-06-08 17:12:25
【问题描述】:

有没有办法在 C 中恢复宏,这样你就可以定义一个新的宏,在这个名称下可能已经定义了其他宏,然后用以前的值重新定义它?

这样当新定义的宏被删除并且最终重新定义的宏被重置为之前的状态时?

例子:

// a macro parameter used in a library
#define size 10
#include <library/use_size.h>

//here the command/pragma to save the definitions
    #define size (100 / sizeof(size_t))
    // some use of size ...
//here the command/pragma to reset the definitions

#include <library/allocator_with_size.h>

#undef size

// use size as a variable name
size_t size = 0;
//...
size += 123;

编辑:我不想使用#undef,因为它不会恢复旧的宏。此外,如果你有很多宏,例如在 X 宏列表中使用它们(在常量数组和结构的长重复代码/声明中),如果有很多 #undef 指令,它看起来很丑。

【问题讨论】:

  • #undef 怎么样?
  • #undef size ....
  • 另外,宏没有“先前状态”。它们要么已定义,要么未定义。
  • 我知道undef,它的代码非常难读。
  • 什么?不,#undef 只删除指定的宏,而不是全部。而且你不能两次定义同一个宏,这是一个错误。当您不再需要宏时,只需执行#undef SIZE。

标签: c c-preprocessor


【解决方案1】:

好的,我自己研究并找到了编译指示 push_macro 和 pop_macro,由 clang、gcc 和 Visual c++ 支持。我用的是clang,所以用起来没问题。缺点:如果要恢复多个宏,它不会减少行数¹,但它会恢复宏并且可以封装:

#pragma push_macro("size")
    #define size (100 / sizeof(size_t))
#pragma pop_macro("size")

注意事项:

¹我定义了多个宏并尝试使用以下方法恢复它们:

#pragma push_macro("size", "key", "name")
    // define them all
#pragma pop_macro("size", "key", "name")

但这还没有在编译器中实现。因此,对于每个宏,必须有单独的一行来执行此操作。

【讨论】:

  • 如果您可以在#pragma 中执行此操作,您可以设置宏以允许每行多次调用(在 MSVC 中不起作用;它们都搞砸了;尽管理论上它们有要做到这一点,他们的非标准编译指示变体会为 push_macro 和 pop_macro 发出垃圾)。但这听起来有点危险......如果你不在标题中这样做,你为什么需要流行音乐?没有其他单位会看到您重新定义的变体(即使您确实“需要”它,您也可以重新排列代码)。如果你是,你不是在设计一些脆弱的东西吗? (而不是在标题中弹出,你不应该碰撞吗?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 2011-03-30
相关资源
最近更新 更多