переопределение с ++ - PullRequest
3 голосов
/ 13 мая 2010

как работает header, включая c ++? У меня уже есть классы, реализованные в файле .h, и когда в двух файлах есть #include, появляется такая ошибка:

files.h:14:7: error: redefinition of ‘class abstract_file’
files.h:14:20: error: previous definition of ‘class abstract_file’`

несколько раз для каждого класса и перечисления. Кто-нибудь может объяснить это?

Ответы [ 6 ]

7 голосов
/ 13 мая 2010

Использование include в C ++ просто берет включенный файл и разбрасывает содержимое туда, куда он включен. Чтобы сделать это, не беспокоясь о множественных включениях одного и того же файла, вы хотите использовать защиту заголовков. Используйте этот базовый формат для всех заголовочных файлов:

#ifndef FILENAME_H
#define FILENAME_H

class foo (or whatever else is in the file!) {
    ...
};

#endif
6 голосов
/ 13 мая 2010

Вы можете включить определение только один раз, но заголовки могут быть включены несколько раз. Чтобы это исправить, добавьте:

#pragma once

вверху каждого заголовочного файла.

Хотя #pragma once относительно распространено, если вы используете более старый компилятор, он может не поддерживаться. В этом случае вам нужно прибегнуть к ручному включению охранников:

#ifndef MY_HEADER_H
#define MY_HEADER_H

...

#endif

(обратите внимание, что вам нужно заменить MY_HEADER_H уникальной строкой для каждого заголовочного файла)

2 голосов
/ 13 мая 2010

Хотя многие люди решили вашу ошибку за вас, похоже, никто не ответил на ваш первоначальный вопрос:

как работает заголовок, в том числе и в c ++?

Когда препроцессор находит директиву #include, он заменяет ее всем содержимым указанного файла.

Вы можете прочитать больше о директивах препроцессора на cplusplus.com .

Обновление : Чтобы проиллюстрировать это, вы можете попробовать следующее, если у вас есть gcc handy:

echo '#include <iostream>' > test.cxx 
gcc -E test.cxx

Вы увидите контрасты iostream, пронизывающие ваши глаза, когда предварительно обработанный исходный код отправляется на стандартный вывод.

2 голосов
/ 13 мая 2010
Заголовочные файлы

обычно определяют уникальный символ, поэтому они включаются только один раз.

, например

#ifndef _myheader_h
#define _myheader_h

// rest of header goes here

#endif

Некоторые компиляторы поддерживают

#pragma once

См. Прагма Однажды в Википедии.

0 голосов
/ 13 мая 2010

Использовать защитные ограждения в заголовочных файлах:

#ifndef FILES_H
#define FILES_H

struct foo {
    int member;
};

#endif // FILES_H

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

Другой способ - использовать #pragma once в заголовочных файлахно это не стандартный C. Он поддерживается Visual C, GCC и Clang, поэтому, скорее всего, его можно использовать.

0 голосов
/ 13 мая 2010

Что вы можете сделать, это защитить свой заголовок от нескольких включений:

#ifndef MY_HEADER__
#define MY_HEADER__

/* your stuff goes here! */

#endif

Вы также можете использовать:

#pragma once

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

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