Не могу решить: «Переопределение макроса NULL» - PullRequest
4 голосов
/ 02 апреля 2019

Я работаю над большим проектом, и у меня есть это предупреждение:

...\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 guard -> то же предупреждение - определение макроса в файле приложения, если «__cplusplus» не определен -> то же предупреждение - в моем файле приложения я попытался определить макрос как недействительный тип указателя вместо чистого «0». Как это:

#ifndef NULL
    /* Deviation MISRA-2 */
    #define NULL    ((void *) 0)
#endif

Из того, что я знаю, если вы переделываете макрос в то же самое, что он уже был определен, не должно быть никаких предупреждений от компилятора. Однако, если я сделаю это, я получу ошибку «несовместимые типы в аргументе» где-то в проекте. По-видимому, мне нужно, чтобы макрос NULL был определен как '0' и не приводился к типу пустого указателя.

Пожалуйста, если возможно, помогите мне понять, почему я получил это предупреждение и как я могу удалить его. Также, пожалуйста, помогите мне понять это: Если в моем файле приложения есть #ifndef NULL ... guard, почему макрос так или иначе переопределяется (так как он уже определен в заголовочном файле от компилятора)? Не должен ли препроцессор пропустить ту строку, которая переопределяет NULL? Я очень смущен этим.

Также одно примечание: я получаю это предупреждение не один, а несколько раз, когда строю свой проект. То же предупреждение о тех же двух файлах. Я думаю, это как-то связано с тем, как файлы включены в скрипт сборки. Пожалуйста, дайте мне несколько идей о том, что нужно расследовать, чтобы понять проблему.

Большое спасибо за чтение моего длинного поста :). Извините, я не могу дать более подробную информацию, так как это проект, связанный с работой.

Ответы [ 3 ]

3 голосов
/ 02 апреля 2019

Измените

/* 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 определяет ноль, потому что порядок важен.
  2. Не определяйте NULL самостоятельно.Просто включите stddef.h файл.Его ждет символ NULL.
3 голосов
/ 02 апреля 2019
...\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.
1 голос
/ 02 апреля 2019

Стандартные включения не ожидают, что будет определено NULL, в отличие от вашего пользовательского включения.

Таким образом, вы должны сначала включить стандартные включения , а затем ваше пользовательское включение.

Обратите внимание, что NULL должно быть определено в stddef.h, чтобы вы могли полностью исключить собственное определение NULL и включить stddef.h везде, где требуется NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...