подавить предупреждения gcc: «предупреждение: это местоположение предыдущего определения» - PullRequest
2 голосов
/ 20 апреля 2009

Мне нужен набор оберток вокруг стандартных системных вызовов: открыть, прослушать и т. Д. Для этого у меня есть несколько "#define", как в:

#define open(a,b,c) JCL_Open(a,b,c)

Но когда я компилирую заголовок и связанные с ним файлы .c, я получаю следующее предупреждение:

/ jcl_wrappers.h: 114: 1: предупреждение: «открыто» переопределено
/jcl_wrappers.h:113:1: предупреждение: это местоположение предыдущего определения

Как я могу подавить эти предупреждения?

Ответы [ 4 ]

5 голосов
/ 20 апреля 2009

Оставьте стандартные функции в покое и переименуйте функцию:

#define myopen(a,b,c) JCL_Open(a,b,c)

Кто-то поблагодарит вас позже.

5 голосов
/ 20 апреля 2009

Поместите включите охрану в ваш заголовочный файл.

В основном вам нужно поместить эти две строки в начало вашего заголовочного файла

#ifndef _yourincludefilename_h_
#define _yourincludefilename_h_

и

#endif /* _yourincludefilename_h_ */

в конце вы включаете файл.

Edit:
Расчер прав, что open не подходит для макроса, так как он конфликтует с библиотечной функцией. Обычно хорошо, когда в Си написаны макросы в верхнем регистре, поэтому я бы предложил изменить ваш макрос на

#define OPEN(a,b,c) JCL_Open(a,b,c)

или даже лучше

#define XYZ_OPEN(a,b,c) JCL_Open(a,b,c)

где XYZ - префикс, специфичный для вашего кода.

1 голос
/ 20 апреля 2009

Вы можете попробовать использовать охрану компиляции. Как:

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/. Не может быть хорошей идеей использовать одно и то же имя для вашего макроса!

0 голосов
/ 20 апреля 2009

Оберните определение в:

#ifndef JCL_WRAPPERS_H
#define JCL_WRAPPERS_H

... your macro's

#endif

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

Обычно это разумно сделать для всех прототипов в заголовках.

...