Подавить предупреждения 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

Это гарантирует, что ваш макрос будет определен только один раз, если вы включите заголовок в нескольких местах.

Как правило, это разумно для всех прототипов в заголовках.

Другие вопросы по тегам