“static const” vs “#define” vs “enum”

后端 未结 17 1488
一生所求
一生所求 2020-11-21 05:45

Which one is better to use among the below statements in C?

static const int var = 5;

or

#define var 5

o

17条回答
  •  北荒
    北荒 (楼主)
    2020-11-21 06:20

    It depends on what you need the value for. You (and everyone else so far) omitted the third alternative:

    1. static const int var = 5;
    2. #define var 5
    3. enum { var = 5 };

    Ignoring issues about the choice of name, then:

    • If you need to pass a pointer around, you must use (1).
    • Since (2) is apparently an option, you don't need to pass pointers around.
    • Both (1) and (3) have a symbol in the debugger's symbol table - that makes debugging easier. It is more likely that (2) will not have a symbol, leaving you wondering what it is.
    • (1) cannot be used as a dimension for arrays at global scope; both (2) and (3) can.
    • (1) cannot be used as a dimension for static arrays at function scope; both (2) and (3) can.
    • Under C99, all of these can be used for local arrays. Technically, using (1) would imply the use of a VLA (variable-length array), though the dimension referenced by 'var' would of course be fixed at size 5.
    • (1) cannot be used in places like switch statements; both (2) and (3) can.
    • (1) cannot be used to initialize static variables; both (2) and (3) can.
    • (2) can change code that you didn't want changed because it is used by the preprocessor; both (1) and (3) will not have unexpected side-effects like that.
    • You can detect whether (2) has been set in the preprocessor; neither (1) nor (3) allows that.

    So, in most contexts, prefer the 'enum' over the alternatives. Otherwise, the first and last bullet points are likely to be the controlling factors — and you have to think harder if you need to satisfy both at once.

    If you were asking about C++, then you'd use option (1) — the static const — every time.

提交回复
热议问题