Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача константы между модулями, как организовать взаимодействие? 
V
    Опции темы
zim22
Дата 26.7.2009, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Есть файл с константами, вынесенными в отдельное пространство имён.
Сами константы определены в cpp файле, в файле заголовке содержатся только их объявления.
Код

// MyNS.h
#ifndef MYNS_H
#define MYNS_H

namespace MyNS {
  extern const int cSize;
}
#endif // MYNS_H


Код

/ MyNS.cpp
#include "MyNS.h"

namespace MyNS {
  extern const int cSize = 66;
}


При попытке использовать константу - получаю ошибку компилятора:  error C2057: expected constant expression
Как исправить?
Код

// main.cpp
#include "MyNS.h"

struct Z {
  int arr[MyNS::cSize]; // error
};

int main() {    
}


Код

// file2.cpp
#include "MyNS.h"

void fcn() {
  int file2_arr[MyNS::cSize]; //  // error
}


Это сообщение отредактировал(а) zim22 - 26.7.2009, 20:01


--------------------
PM MAIL   Вверх
mes
Дата 26.7.2009, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



(во втором блоке кода) при определении константы extern лишний


--------------------
PM MAIL WWW   Вверх
zim22
Дата 26.7.2009, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(mes @  26.7.2009,  20:09 Найти цитируемый пост)
 при определении константы extern лишний

убрал extern из определения - ничего не изменилось. та же самая ошибка компиляции.
и в gcc тоже не компилится. (в MSVC 2008 собирал до этого).
Код

// main.cpp
#include "MyNS.h"
struct Z {
  int arr[MyNS::cSize]; // error
};

Цитата

gcc error: main.cpp|5|error: data member may not have variably modified type `int[((unsigned int)MyNS::cSize)]'|

***
в определении константы я слово extern специально написал, т.к. у Страуструпа написано, что 
Цитата

По  умолчанию const подразумевает внутреннюю компоновку... Можно заставить константу компоноваться внешним образом путем её явного объявления.

и пример приводится:
Код

// file1.c
extern const int a = 77;

// file2.c
extern const int a;

void g() {
  cout << a;  // выведет 77
}


Это сообщение отредактировал(а) zim22 - 26.7.2009, 20:57


--------------------
PM MAIL   Вверх
mes
Дата 26.7.2009, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(zim22 @  26.7.2009,  19:56 Найти цитируемый пост)
та же самая ошибка компиляции.

Пропустил.  smile Вы создаете статический массив с  размером по "екстреной" константе.  Так не пойдет, потому что значение такой константы будет известно лишь на этапе линковки, а должно на этапе компиляции. т.е. необходимо constant expression.

Это сообщение отредактировал(а) mes - 26.7.2009, 21:42


--------------------
PM MAIL WWW   Вверх
zim22
Дата 26.7.2009, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



решил проблему так:
1) избавился от файла MyNS.cpp
2) изменил файл MyNS.h
Код

// MyNS.h
#ifndef MYNS_H
#define MYNS_H

namespace MyNS {
  const int cSize = 16;
}
#endif // MYNS_H


теперь  для каждой единицы трансляции создаётся своя, уникальная переменная cSize.


Это сообщение отредактировал(а) zim22 - 26.7.2009, 21:33


--------------------
PM MAIL   Вверх
mes
Дата 26.7.2009, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(zim22 @  26.7.2009,  20:32 Найти цитируемый пост)
теперь  для каждой единицы трансляции создаётся своя, уникальная переменная cSize.

Код

namespace MyNS {
       enum  { cSize=16 };
}

чтоб не создавалась smile 


--------------------
PM MAIL WWW   Вверх
andrew_121
Дата 26.7.2009, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(mes @  26.7.2009,  21:36 Найти цитируемый пост)
чтоб не создавалась

 smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
zim22
Дата 27.7.2009, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(mes @  26.7.2009,  21:36 Найти цитируемый пост)
чтоб не создавалась

о как! интересно smile


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0480 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.