Я работаю над большим проектом, и у меня есть это предупреждение:
...\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? Я очень смущен этим.
Также одно примечание: я получаю это предупреждение не один, а несколько раз, когда строю свой проект. То же предупреждение о тех же двух файлах. Я думаю, это как-то связано с тем, как файлы включены в скрипт сборки. Пожалуйста, дайте мне несколько идей о том, что нужно расследовать, чтобы понять проблему.
Большое спасибо за чтение моего длинного поста :). Извините, я не могу дать более подробную информацию, так как это проект, связанный с работой.