如何连接宏值

分享于2022年09月08日 c-preprocessor 问答
【问题标题】:How to concatenate macrovalues如何连接宏值
【发布时间】:2022-08-01 22:26:55
【问题描述】:

首先:这涉及为 DB 构建 SQL 数据库脚本(来自 ASA 概念)。这些脚本使用 c-预处理器 来自“克宁汉·里奇 (1978)”。所以我不能改变它。


我尝试建立一个依赖定义。

我用“202207”定义“MONTH”。然后我想用“20220731”自动定义“MONTH_MAX”,用“20220700”自动定义“MONTH_MIN”。

或者更好的宏“MONTH_MAX(month)month31”

我试过了

#define MONTH 202207
#define MONTH_MAX MONTH31
#define MONTH_MIN MONTH00

但随后“MONTH_MIN”变为“MONTH00”而不是“20220700”。

#define MONTH_MIN(month) month00
#define MONTH 202207

所以如果我打电话给 MONTH_MIN(MONTH),我会得到“month00”

#define MONTH_MIN(month) month ## 00 202207 ## 00


以下作品:

#define FILE(name) '/db/name'
FILE(customers)

所以 FILE(customers) 被替换为 '/db/customes'


最后看起来像(db-syntax 不重要)

“查询.dbq”:

#define FILE(name) '/db/name'

#define MIN_MONTH(month) month00

#define KTNR  134256
#define MONTH 202107

(
  FILE(customers)
    ::
  cst_ktnr == KTNR
    %%
  cst_nr
  cst_ktnr
)
  **
(
  FILE(orders)
    ::
  cst_last_order <= MIN_MONTH(MONTH)  // here I need 20210700
    %%
  cst_nr = ord_customer
)

它成为了

#line 1 ""
// 7 empty lines
(
  '/db/customers'
    ::
  cst_ktnr == 134256
    %%
  cst_nr
  cst_ktnr
)
  **
(
  '/db/orders'
    ::
  cst_last_order <= month00  // here I need 20210700
    %%
  cst_nr == ord_customer
)

我试过了

#define MIN_MONTH(month) month##00     -->    202107##00
#define MIN_MONTH(month) month ## 00   -->    202107 ## 00
#define MIN_MONTH(month) month00       -->    month00

  • MIN_MONTH(202107) 被定义为 month##00 时,它会给你什么?
  • 我得到 202107##00
  • 那么你的预处理器必须被破坏;我得到 20210700 。问题在于将宏作为参数传递给另一个宏。
  • 传递另一个宏的值。 MIN_MONTH(MONTH) 也提供 202107##00 (如果 #define MONTH 202107 )。所以我认为“##”运算符不起作用。
  • 有关于预处理器实现的任何信息吗?

【解决方案1】:

如果你可以使用算术,那么:

#define MONTH_MAX (MONTH*100+31)

【讨论】: