代码之家  ›  专栏  ›  技术社区  ›  mara004

理解C版本的宏(看起来像未声明的变量?)

  •  0
  • mara004  · 技术社区  · 2 年前

    我碰巧读过 ArduinoJson/version.hpp ,其中包含以下宏:

    #define ARDUINOJSON_VERSION_MACRO V701
    

    现在,我是一个python开发人员,对ctypes(gen)中的C语言有着非常基本的理解。 在我看来 V701 是一个未声明的变量,但这似乎是故意的。

    有人能向我解释一下发生了什么事吗?这样做的目的是什么?为什么没有报价?

    2 回复  |  直到 2 年前
        1
  •  3
  •   Barmar    2 年前

    它本身并没有被用作一个值。在Namespace.hpp中,您可以找到用法:

    #  define ARDUINOJSON_VERSION_NAMESPACE                                    \
        ARDUINOJSON_CONCAT4(ARDUINOJSON_VERSION_MACRO,                         \
                            ARDUINOJSON_BIN2ALPHA(ARDUINOJSON_ENABLE_PROGMEM,  \
                                                  ARDUINOJSON_USE_LONG_LONG,   \
                                                  ARDUINOJSON_USE_DOUBLE, 1),  \
                            ARDUINOJSON_BIN2ALPHA(ARDUINOJSON_ENABLE_NAN,      \
                                                  ARDUINOJSON_ENABLE_INFINITY, \
                                                  ARDUINOJSON_ENABLE_COMMENTS, \
                                                  ARDUINOJSON_DECODE_UNICODE), \
                            ARDUINOJSON_SLOT_ID_SIZE)
    

    然后搜索的定义 ARDUINO_JSON_CONCAT4 您发现:

    #define ARDUINOJSON_CONCAT_(A, B) A##B
    #define ARDUINOJSON_CONCAT2(A, B) ARDUINOJSON_CONCAT_(A, B)
    #define ARDUINOJSON_CONCAT4(A, B, C, D) \
      ARDUINOJSON_CONCAT2(ARDUINOJSON_CONCAT2(A, B), ARDUINOJSON_CONCAT2(C, D))
    

    因此,它最终被用于标记粘贴,并将成为的值的一部分 ARDUINOJSON_VERSION_NAMESPACE .

        2
  •  1
  •   Vikas Deolaliker    2 年前

    您定义了一个宏,其中字符串ARDUINOJSON_VERSION_MRO将在编译代码之前由c-pre-processor替换源代码中的V701。