Подавить предупреждения gcc: "предупреждение: это местоположение предыдущего определения"
Мне нужен набор оберток вокруг стандартных системных вызовов -open,listen и т. Д. Для этого у меня есть несколько "#define", как в:
#define open(a,b,c) JCL_Open(a,b,c)
Но когда я компилирую заголовок и связанные файлы.c, я получаю следующее предупреждение:
/jcl_wrappers.h:114:1: предупреждение: "открыто" переопределено
/jcl_wrappers.h:113:1: предупреждение: это местоположение предыдущего определения
Как я могу подавить эти предупреждения?
4 ответа
Поместите включить охранники в свой заголовочный файл.
По сути, вам нужно поместить эти две строки в начало вашего заголовочного файла.
#ifndef _yourincludefilename_h_
#define _yourincludefilename_h_
а также
#endif /* _yourincludefilename_h_ */
в конце вы включаете файл.
Редактировать:
Расчер прав, что open не подходит для макроса, так как он конфликтует с библиотечной функцией. Обычно это хорошая C-конвенция - делать макросы прописными, поэтому я бы предложил изменить ваш макрос на
#define OPEN(a,b,c) JCL_Open(a,b,c)
или даже лучше
#define XYZ_OPEN(a,b,c) JCL_Open(a,b,c)
где XYZ - префикс, специфичный для вашего кода.
Оставьте стандартные функции в покое и переименуйте функцию:
#define myopen(a,b,c) JCL_Open(a,b,c)
Кто-то поблагодарит вас позже.
Вы можете попробовать использовать охрану компиляции. Подобно:
my_headers.h:
#ifndef __MY_HEADERS
#define __MY_HEADERS
#define open(a,b,c) JCL_Open(a,b,c)
#endif
Это будет делать то, что находится между #ifndef и #endif, только если был определен макрос '__MY_HEADERS'. Итак, все в вашем.h файле будет объявлено только один раз.
Вы можете использовать ту же конструкцию, чтобы увидеть, определен ли макрос "open".
Также имейте в виду, что уже есть функция C, которая называется open (): http://www.manpagez.com/man/2/open/. Не может быть хорошей идеей использовать одно и то же имя для вашего макроса!
Оберните определение в:
#ifndef JCL_WRAPPERS_H
#define JCL_WRAPPERS_H
... your macro's
#endif
Это гарантирует, что ваш макрос будет определен только один раз, если вы включите заголовок в нескольких местах.
Как правило, это разумно для всех прототипов в заголовках.