无法解决:“ NULL宏的定义”

时间:2019-04-02 08:36:07

标签: c

我正在做一个大项目,并且收到以下警告:

...\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的那一行吗?我对此很困惑。

还有一个注意事项:构建项目时,我收到此警告不是一次,而是几次。关于相同的两个文件的相同警告。我想这与如何将文件包含在构建脚本中有关。请给我一些想法,以进行调查以了解该问题。

非常感谢您阅读我的冗长文章:)。抱歉,我无法提供更多细节,因为这是与工作相关的项目。

3 个答案:

答案 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中的定义。错误消息的顺序有些混乱。

您有三个选择:

  1. 根本不在头文件中定义NULL。稍后将通过stddef.h进行定义。如果您在标题中使用NULL,则可能无法使用。
  2. 在您的头文件之前,在{em>之前插入stddef.h
  3. 在头文件中包含stddef.h ,而不是定义NULL

答案 1 :(得分:3)

更改

/* NULL pointer definition if not already defined */
#ifndef NULL
    /* Deviation MISRA-2 */
    #define NULL   0
#endif

进入

#include <stddef.h>
  1. 出现错误,因为您的文件包含在stddef.h之前。因此,首先,您的文件定义NULL,然后stddef.h定义null,因为顺序很重要。
  2. 不要自己定义NULL。仅包含stddef.h文件。它有NULL符号在等您。

答案 2 :(得分:1)

与自定义包含不同,标准包含不希望定义NULL

因此,您应该首先包含标准包含然后您的自定义包含。

请注意,NULL必须在stddef.h中进行定义,因此,您可以完全放弃自己对NULL的定义,并在需要stddef.h的任何地方包含NULL