Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.07.2013, 13:46   #1
rock-n-roll_74
Новичок
Джуниор
 
Регистрация: 13.07.2013
Сообщений: 4
Вопрос Переопределение типов в разных модулях

Вообщем, проблема состоит в том, что у меня есть 4 модуля и главная модуль: TransBlock, LexBlock, KeyWordsldBlock, SyntBlock, main. Во всех используется один и тот же тип:

Цитата:
struct lexeme
{
char value[SIZE]; //значение лексемы
char type[15]; //тип лексемы
};
константа:
Цитата:
const int SIZE = 81; //максимальная длина входной строки
и переменная, которая решается extern'ом...
Вообщем вот заголовочные файлы модулей:

TransBlock:
Цитата:
const int SIZE = 81;

struct lexeme
{
char value[SIZE];
char type[15];
};


void TransBlock(char s[SIZE],lexeme symbols[SIZE]);
LexBlock:
Цитата:
const int SIZE = 81;

struct lexeme
{
char value[SIZE];
char type[15];
};

void LexBlock(lexeme symbols[],lexeme words[]);
KeyWordsIdBlock:
Цитата:
const int SIZE = 81;

struct lexeme
{
char value[SIZE];
char type[15];
};

void KeyWordsIdBlock (lexeme words[SIZE]);
SyntBlock:
Цитата:
const int SIZE = 81;

struct lexeme
{
char value[SIZE];
char type[15];
};

bool SyntBlock(lexeme words[]);
Вообщем побывал создать заголовочный файл Import.h, где содержится все эти типы и константа, и подключать ко всем остальным, но таже самая фигня...

Вот ошибка и так для каждого блока:
Цитата:
c:\program\main\main\transblock.h(1 ): error C2374: SIZE: переопределение; множественная инициализация
1> c:\program\main\main\main.cpp(1): см. объявление "SIZE"
1>c:\program\main\main\transblock.h (4): error C2011: lexeme: переопределение типа "struct"
1> c:\program\main\main\main.cpp(4): см. объявление "lexeme"
Вообщем буду рад любому совету, любой литературе...
rock-n-roll_74 вне форума Ответить с цитированием
Старый 13.07.2013, 13:55   #2
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Цитата:
const int SIZE = 81;

struct lexeme
{
char value[SIZE];
char type[15];
};
Эта структура должна быть в одном экземпляре. Ты мог бы сделать один инклудер с одной структурой и всеми прототипами функций.
А если тебе нужен тип lexeme то объявлять следует как typedef struct{int a; int b}lexeme; иначе в функциях прийдётся писать struct lexeme lex тоесть структура типа lexeme с названием lex. и в функции название при написании прототипа использовать необязательно пример void func(lexeme*); Правда если ето крестики то я хз помог ли.
do not use your brain

Последний раз редактировалось Кащей; 13.07.2013 в 13:59.
Кащей вне форума Ответить с цитированием
Старый 13.07.2013, 14:13   #3
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Это называется неоднозначность. Вы подключаете заголовочные файлы, и в каждом из них содержаться структура lexem (т.е новый пользовательский тип данных).
Вынесите объявление данной структуры в отдельный заголовочный файл (например, Lexeme.h) и в ЭТОМ заголовочном файле поместите защиту от повторного подключения - директива #pragma once.
Пример,
Код:
/***************MODULE HEADER********/
#pragma once;
struct lexeme 
{
char value[SIZE];
char type[15];
};
Константы лучше всего вынести в заголовочный файл, а их определения вынести в отдельный .cpp модуль. И уже подключать к вашему Lexeme.h.
Igor95 вне форума Ответить с цитированием
Старый 13.07.2013, 14:16   #4
rock-n-roll_74
Новичок
Джуниор
 
Регистрация: 13.07.2013
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Кащей Посмотреть сообщение
Эта структура должна быть в одном экземпляре. Ты мог бы сделать один инклудер с одной структурой и всеми прототипами функций.
Вы имеете ввиду создать заголовочный файл Import.h, туда поместить
Цитата:
const int SIZE = 81;
struct lexeme
{
char value[SIZE];
char type[15];
};

void LexBlock(lexeme symbols[],lexeme words[]);
void TransBlock(char s[],lexeme symbols[]);
....
а потом подключать этот файл? в другие заголовки, LexBlock.h, TransBlock.h и т.д. Просто это не работает, т.к. все 4 модуля одноуровневые, а при подставление кода инклудом, компилятор второй раз встречает определение типа и начинает ругаться...

Цитата:
Сообщение от Кащей Посмотреть сообщение
А если тебе нужен тип lexeme то объявлять следует как typedef struct{int a; int b}lexeme; иначе в функциях прийдётся писать struct lexeme lex тоесть структура типа lexeme с названием lex. и в функции название при написании прототипа использовать необязательно пример void func(lexeme*);
Ну на счет этого я знаю=) можно без typedef вроде, по крайней мере у меня работает и так и так.
Цитата:
Правда если ето крестики то я хз помог ли.
Простите, это что? Я пишу на с++ совсем недавно, поэтому не совсем все понимаю
rock-n-roll_74 вне форума Ответить с цитированием
Старый 13.07.2013, 14:23   #5
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Цитата:
const int SIZE = 81;
struct lexeme
{
char value[SIZE];
char type[15];
};

void LexBlock(lexeme symbols[],lexeme words[]);
void TransBlock(char s[],lexeme symbols[]);
....
а потом подключать этот файл? в другие заголовки, LexBlock.h, TransBlock.h и т.д. Просто это не работает, т.к. все 4 модуля одноуровневые, а при подставление кода инклудом, компилятор второй раз встречает определение типа и начинает ругаться...
Это неоднозначность имен. Просто поместите в начале заголовочного файла директиву #pragma once. Это защитит от повторного подключения заголовочного файла, а следовательно и от коллизии имен, тоже, защитит.

Проблема вот в чем:
В Main.cpp при подключении ваших LexBlock.h, TransBlock.h и т.д, в КАЖДОМ ИЗ КОТОРЫХ УЖЕ подключен Lexeme.h происходит коллизия имен.
Igor95 вне форума Ответить с цитированием
Старый 13.07.2013, 14:26   #6
rock-n-roll_74
Новичок
Джуниор
 
Регистрация: 13.07.2013
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Igor95 Посмотреть сообщение
Это называется неоднозначность. Вы подключаете заголовочные файлы, и в каждом из них содержаться структура lexem (т.е новый пользовательский тип данных).
Вынесите объявление данной структуры в отдельный заголовочный файл (например, Lexeme.h) и в ЭТОМ заголовочном файле поместите защиту от повторного подключения - директива #pragma once.
Пример,
Код:
/***************MODULE HEADER********/
#pragma once;
struct lexeme 
{
char value[SIZE];
char type[15];
};
Константы лучше всего вынести в заголовочный файл, а их определения вынести в отдельный .cpp модуль. И уже подключать к вашему Lexeme.h.
Спасибо за помощь=)
rock-n-roll_74 вне форума Ответить с цитированием
Старый 13.07.2013, 14:32   #7
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Цитата:
Сообщение от rock-n-roll_74 Посмотреть сообщение
Спасибо за помощь=)
эммм, так помогло или нет?
Igor95 вне форума Ответить с цитированием
Старый 13.07.2013, 15:10   #8
rock-n-roll_74
Новичок
Джуниор
 
Регистрация: 13.07.2013
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Igor95 Посмотреть сообщение
эммм, так помогло или нет?
Да=), правда теперь приходиться изменять названия некоторых переменных и функций с одинаковыми названиями в разных модулях...
rock-n-roll_74 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Одинаковие типы в разных модулях. GBAXA Общие вопросы Delphi 2 06.08.2010 13:36
Вывод профайлов разных типов Krasi PHP 6 21.07.2010 18:44
произведение разных типов Асхат Microsoft Office Excel 2 23.04.2010 01:02
Обьединение разных типов даных женя2010 Microsoft Office Excel 3 21.04.2010 12:56
Перевод переменных разных типов LeoN Общие вопросы Delphi 3 23.03.2007 00:15