我对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
我该如何避免这个问题?