我正在做一个大项目,我有这样的警告:
...\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 NULL
/* Deviation MISRA-2 */
#define NULL ((void *) 0)
#endif据我所知,如果您将宏重新定义为已经定义的宏,则编译器不应发出警告。但是,如果我这样做,我会在项目的某个地方得到一个incompatible types at argument错误。显然,我需要空宏被定义为'0‘,而不是抛出到一个空指针类型。
如果可能的话,请帮助我理解为什么我会收到这样的警告,以及如何删除它。另外,请帮助我理解这一点:如果在我的应用程序文件中我有#ifndef NULL...guard,为什么要重新定义宏(因为它已经在编译器的头文件中定义了)?预处理器不应该跳过重新定义NULL的那一行吗?我对此很困惑。
还有一个注意事项:当我构建我的项目时,我得到的警告不是一次,而是几次。对同一两个文件的相同警告。我想,对于如何将文件包含在构建脚本中,应该有一些事情要做。请给我一些关于调查什么来理解这个问题的想法。
非常感谢您阅读我的长篇文章☺。很抱歉,我不能给出更多的细节,因为这是一个工作相关的项目。
发布于 2019-04-02 08:40:40
...\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。发布于 2019-04-02 08:45:10
变化
/* 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符号在等着你。发布于 2019-04-02 08:40:59
标准包含不要期望定义NULL,不像您的自定义包含。
因此,您首先应该包括标准包含,然后是您的自定义包含。
请注意,NULL必须在stddef.h中定义,这样您就可以完全放弃自己对NULL的定义,并在需要stddef.h的地方包含stddef.h。
https://stackoverflow.com/questions/55470305
复制相似问题