我正在做一个大项目,并且收到以下警告:
...\include\stddef.h" 38/9] macro "NULL" redefined
...\ncs_types.h" 125/13] previous definition of macro "NULL"
在来自编译器安装文件夹的第一个文件'stddef.h'中,我具有以下内容:
#ifdef __cplusplus
#define NULL (0)
#else /* defined(__cplusplus) */
#define NULL ((void *) 0)
#endif /* defined(__cplusplus) */
不允许我修改此文件。
现在在另一个文件中,该文件是应用程序代码的一部分(允许我对其进行修改。因此,我必须通过在应用程序代码中对文件进行某些操作来摆脱此警告,并且不要触摸其他文件一)我有这个:
/* NULL pointer definition if not already defined */
#ifndef NULL
/* Deviation MISRA-2 */
#define NULL 0
#endif
然后我得到那个警告。我不能摆脱它。我已经尝试过诸如: -在应用程序中取消定义文件中的宏->同样的警告 -包括#ifndef卫兵->同样的警告 -如果未定义'__cplusplus',则在应用程序文件中取消定义宏->相同警告 -在我的应用程序文件中,我尝试将宏定义为void指针类型,而不是纯0。像这样:
#ifndef NULL
/* Deviation MISRA-2 */
#define NULL ((void *) 0)
#endif
据我所知,如果您将宏重新定义为已经定义的相同内容,则编译器将不会发出警告。但是,如果执行此操作,则会在项目中某处出现“参数不兼容类型”错误。显然,我需要将NULL宏定义为“ 0”,而不要强制转换为空指针类型。
请尽可能帮助我理解为什么收到该警告以及如何删除该警告。还请帮助我理解这一点: 如果在我的应用程序文件中我有#ifndef NULL ...,那么为什么仍然要重新定义宏(因为已经在编译器的头文件中定义了该宏)?预处理程序不应该跳过重新定义NULL的那一行吗?我对此很困惑。
还有一个注意事项:构建项目时,我收到此警告不是一次,而是几次。关于相同的两个文件的相同警告。我想这与如何将文件包含在构建脚本中有关。请给我一些想法,以进行调查以了解该问题。
非常感谢您阅读我的冗长文章:)。抱歉,我无法提供更多细节,因为这是与工作相关的项目。
答案 0 :(得分:3)
...\include\stddef.h" 38/9] macro "NULL" redefined
...\ncs_types.h" 125/13] previous definition of macro "NULL"
这告诉您NULL
最初是在ncs_types.h
中定义的,然后是重新定义在stddef.h
中的定义。错误消息的顺序有些混乱。
您有三个选择:
NULL
。稍后将通过stddef.h
进行定义。如果您在标题中使用NULL
,则可能无法使用。stddef.h
。stddef.h
,而不是定义NULL
。答案 1 :(得分:3)
更改
/* NULL pointer definition if not already defined */
#ifndef NULL
/* Deviation MISRA-2 */
#define NULL 0
#endif
进入
#include <stddef.h>
stddef.h
之前。因此,首先,您的文件定义NULL,然后stddef.h
定义null,因为顺序很重要。stddef.h
文件。它有NULL
符号在等您。答案 2 :(得分:1)
与自定义包含不同,标准包含不希望定义NULL
。
因此,您应该首先包含标准包含然后您的自定义包含。
请注意,NULL
必须在stddef.h
中进行定义,因此,您可以完全放弃自己对NULL
的定义,并在需要stddef.h
的任何地方包含NULL
。