首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法解决:“重新定义空宏”

无法解决:“重新定义空宏”
EN

Stack Overflow用户
提问于 2019-04-02 08:36:06
回答 3查看 694关注 0票数 4

我正在做一个大项目,我有这样的警告:

代码语言:javascript
复制
...\include\stddef.h" 38/9] macro "NULL" redefined
...\ncs_types.h" 125/13] previous definition of macro "NULL"

在来自编译器安装文件夹的第一个文件stddef.h中,我有以下内容:

代码语言:javascript
复制
#ifdef  __cplusplus
#define NULL    (0)
#else   /* defined(__cplusplus) */
#define NULL    ((void *) 0)
#endif  /* defined(__cplusplus) */

我不允许修改这个文件。

现在,在另一个文件中,它是应用程序代码的一部分(我可以修改这个文件)。因此,我必须通过从应用程序代码中执行文件中的一些操作来消除这个警告,并且不要碰另一个),我有以下内容:

代码语言:javascript
复制
/* NULL pointer definition if not already defined */
#ifndef NULL
    /* Deviation MISRA-2 */
    #define NULL   0
#endif

然后我收到警告。我无法摆脱它。我尝试过这样的方法:

  • 从应用程序->取消在我的文件中定义宏的警告
  • 包括一个#ifndef警卫->相同的警告
  • 如果“__cplusplus”未定义,则取消定义应用程序文件中的宏->相同的警告
  • 在我的应用程序文件中,我尝试将宏定义为无效指针类型,而不是纯'0‘。 如下所示:
代码语言:javascript
复制
#ifndef NULL
    /* Deviation MISRA-2 */
    #define NULL    ((void *) 0)
#endif

据我所知,如果您将宏重新定义为已经定义的宏,则编译器不应发出警告。但是,如果我这样做,我会在项目的某个地方得到一个incompatible types at argument错误。显然,我需要空宏被定义为'0‘,而不是抛出到一个空指针类型。

如果可能的话,请帮助我理解为什么我会收到这样的警告,以及如何删除它。另外,请帮助我理解这一点:如果在我的应用程序文件中我有#ifndef NULL...guard,为什么要重新定义宏(因为它已经在编译器的头文件中定义了)?预处理器不应该跳过重新定义NULL的那一行吗?我对此很困惑。

还有一个注意事项:当我构建我的项目时,我得到的警告不是一次,而是几次。对同一两个文件的相同警告。我想,对于如何将文件包含在构建脚本中,应该有一些事情要做。请给我一些关于调查什么来理解这个问题的想法。

非常感谢您阅读我的长篇文章☺。很抱歉,我不能给出更多的细节,因为这是一个工作相关的项目。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-02 08:40:40

代码语言:javascript
复制
...\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. 在头文件之前包括stddef.h
  3. 在头文件中包含stddef.h,而不是定义NULL
票数 3
EN

Stack Overflow用户

发布于 2019-04-02 08:45:10

变化

代码语言:javascript
复制
/* NULL pointer definition if not already defined */
#ifndef NULL
    /* Deviation MISRA-2 */
    #define NULL   0
#endif

转到

代码语言:javascript
复制
#include <stddef.h>
  1. 您有此错误,因为您的文件包含在stddef.h之前。因此,首先您的文件定义NULL,然后stddef.h定义null,因为顺序很重要。
  2. 不要自己定义NULL。只需包含stddef.h文件。它的NULL符号在等着你。
票数 3
EN

Stack Overflow用户

发布于 2019-04-02 08:40:59

标准包含不要期望定义NULL,不像您的自定义包含。

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

请注意,NULL必须在stddef.h中定义,这样您就可以完全放弃自己对NULL的定义,并在需要stddef.h的地方包含stddef.h

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55470305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档