作者Schottky (顺风相送)
看板C_and_CPP
标题Re: [问题] 确保#define的值在编译时正确
时间Tue Jul 11 11:36:21 2017
※ 引述《james732 (好人超)》之铭言:
: 但写起来很丑又累赘…
: 会需要用同样的方式再去检查BAR_VALUE, ABC_VALUE...等等
: 这样一堆写起来还挺可怕的orz
: 想请问要达成一样的事,还有没有其他的写法呢?
听起来你的需求是防呆,阻止别人使用你不承认的值。
通常我的作法是定义几个 macro 让别人选用,但禁止直接使用数字
in foo.h:
#define FOO_VALUE_A 5
#define FOO_VALUE_B 11
#define FOO_VALUE_C 18
#define FOO_VALUE_D 21
#define FOO_VALUE_E 29
再让别人这样定义:
#define FOO_VALUE FOO_VALUE_A
如此当这行 define 的值不是 FOO_VALUE_ 开头的允许值时 (比如直接填数字 30)
那 code review 很容易看得出来
而他自己手误写成 FOO_VALUE_30 或 FOO_VALUE_F 的时候,
靠 compiler 的检查也很容易发现它是 undefined macro
这种作法我最早是在 X lib (UNIX X window library) 的字串定义上看到的,
虽然函数实际上吃的是字串,但不希望你自己打字串,太容易手误,
必须用 macro 让 compiler 帮你检查无心的拼字错误
当然这方法在队友脑残过度的状况下是没有用的,你只能尽量防呆,防不了真正脑残
真正的脑残会在 compiler 靠腰时去 foo.h 加一行 #elif FOO_VALUE == 30
或乾脆把整段检查注解掉,然後很得意的告诉你说他解决了那个 compiler error
--
桃乐丝: 可是, 如果你没有头脑, 为什麽会说话?
稻草人: ㄝ, 我也不知... 但是有些人没有头脑也能说超~多话呢。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.167.35.210
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1499744184.A.F99.html
1F:推 james732: 有道理,而且後面的描述好有画面orz 07/11 11:57
2F:→ uranusjr: 如果是 C++11 还能用 enum class 挡一下, C 就无法了 07/11 12:03
3F:推 james732: 我是写在嵌入式的纯C Q_Q 07/11 12:37
4F:推 Hazukashiine: 题外话 没有 undefined macro 这种东西 www 07/11 18:16
5F:推 chuegou: 这个好 推一个 07/11 19:21