PC-lint预处理

时间:2014-12-16 17:22:18

标签: c gcc c-preprocessor lint pc-lint

我对lint和gcc预处理器之间的区别有疑问。 例如:

#ifndef PRE
#define PRE HLL_
#endif

#define DECLARE_PROC(a,b) DECLARE_PROC_WITH_SP(a##b)
#define P_DECLARE(a,b) DECLARE_PROC(a,b)
#define DECLARE(a) P_DECLARE(PRE,a)

DECLARE(NODE_1)

我用它像:

#define DECLARE_PROC_WITH_SP(OBJ)          \
struct INFO_s *INFO_##OBJ##_p =            \
  &INFO_defaultNode;                       \
void INFO_registerNode_##OBJ(void)         \
{                                          \
  INFO_registerInf(#OBJ, &INFO_##OBJ##_p); \
}

gcc一切都很好。 Lint给出以下错误:

nodeLog.c  254  Error 10: Expecting ';'
nodeLog.c  254  Error 10: Expecting ';'
nodeLog.c  254  Error 10: Expecting ','
nodeLog.c  254  Error 26: Expected an expression, found ')'
nodeLog.c  254  Error 144: Non-existent return value for Symbol 'INFO_registerInf(const char *, struct INFO_s **)', compare with line 351, file ...
nodeLog.c  254  Error 10: Expecting '}'

这是lint预处理器的结果:

/*lint -save -e506 *//*lint -save -e506 *//*lint -save -e506 *//*lint -save -e506 */ struct INFO_s *INFO_/*lint -save -e506 */ HLL_ /*lint -restore */ NODE_1_p = &INFO_defaultNode;void INFO_registerNode_/*lint -save -e506 */ HLL_ /*lint -restore */ NODE_1(void){ INFO_registerInf("/*lint -save -e506 */HLL_ /*lint -restore */NODE_1", &INFO_/*lint -save -e506 */ HLL_ /*lint -restore */ NODE_1_p); }/*lint -restore *//*lint -restore *//*lint -restore *//*lint -restore */

问题在于:

   struct INFO_s *INFO_/*lint -save -e506 */ HLL_ /*lint -restore */ NODE_1_p

似乎lint预处理器会添加空格。

如果我改变:

#ifndef PRE
#define PRE HLL_
#endif

#define DECLARE(a) P_DECLARE(PRE,a)

为:

#define DECLARE(a) P_DECLARE(HLL_,a)

一切都很好:

/*lint -save -e506 *//*lint -save -e506 *//*lint -save -e506 *//*lint -save -e506 */ struct INFO_s *INFO_HLL_NODE_1_p = &INFO_defaultNode;void INFO_registerNode_HLL_NODE_1(void){ INFO_registerInf("HLL_NODE_1", &INFO_HLL_NODE_1_p); }/*lint -restore *//*lint -restore *//*lint -restore *//*lint -restore */

问题消失了:

struct INFO_s *INFO_HLL_NODE_1_p

我该如何避免这个问题?

0 个答案:

没有答案