在不需要的宏使用上强制C ++错误

时间:2014-02-25 12:01:03

标签: c++ c c-preprocessor preprocessor-directive

我到处都有一个宏

   #define DBG(s) do_something_with(s)

但是,在其中一个文件中,我想让它无法使用 - 并导致编译错误

#ifdef DBG
#undef DBG
#define DBG(s) #error "do not use DBG in this file"
#endif

显然,我的例子不起作用。有什么建议可以完成吗?

4 个答案:

答案 0 :(得分:3)

在C ++ 11中,您可以执行以下操作:

#ifdef DBG
# undef DBG
#endif
#define DBG(s) static_assert(false, "you should not use this macro")

出现如下错误消息:

C:/Code/Test/src/src/main.cpp: In function 'int main(int, char**)':
C:/Code/Test/src/src/main.cpp:38:16: error: static assertion failed: you should not use this macro
 #define DBG(s) static_assert(false, "you should not use this macro")
                ^
C:/Code/Test/src/src/main.cpp:45:5: note: in expansion of macro 'DBG'
     DBG(42);
     ^

在C / C ++ 03中,简单的#undef将导致类似:

C:/Code/Test/src/src/main.cpp:45:11: error: 'DBG' was not declared in this scope

这可能已经足够了。

答案 1 :(得分:2)

如果您需要避免预处理器使用DBG,大多数预处理器都支持您可以使用的#error指令,

#ifdef DBG
#error "do not use DBG in this file"
#endif

但是,如果要阻止宏在代码中展开,则可以依赖未定义类型sizeof的{​​{1}}在编译时失败,

DBG

答案 2 :(得分:1)

当然,你可以定义它来做一些无效的事情。

然后你会得到编译错误,但它们不会非常“清晰”。

类似的东西:

#undef DBG
#define DBG(s) please_dont_use_dbg_in_this_file()

或者正如评论中指出的那样,只是保持未定义,然后你会得到一个关于未定义引用的错误:

#undef DBG

这或许可以被认为更清楚,我不是百分百肯定。

答案 3 :(得分:1)

只需在.cpp文件中执行此操作

#ifdef DBG
#undef DBG
#endif

这样一来,遇到DBG时你的编译就会失败