атрибут static const - баг gcc ?
От: dad  
Дата: 11.05.06 14:17
Оценка:
есть абстрактный класс (интерфейс)

struct any
{
   static const int v = -1;
   virtual void doit() = 0;
};

Где то в so :

[c]
void some()
{
  any::v;
}


при явной компоновке либа не грузится.

ldd ругается на undefied symbol any::v

в чем проблема?
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re: атрибут static const - баг gcc ?
От: DigitalGuru Россия http://svetlyak.ru
Дата: 11.05.06 14:21
Оценка:
Здравствуйте, dad, Вы писали:

dad>ldd ругается на undefied symbol any::v


dad>в чем проблема?


Вынести инициализацию в C файл?
Re[2]: атрибут static const - баг gcc ?
От: dad  
Дата: 11.05.06 14:25
Оценка:
dad>>ldd ругается на undefied symbol any::v

dad>>в чем проблема?


DG>Вынести инициализацию в C файл?


в каждую dll то ?
проще enum{} сделать.

интересуте не баг ли это? gcc 4.0.2 кажется. на более старых все ок.
на vs тоже.
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re: атрибут static const - баг gcc ?
От: Lorenzo_LAMAS  
Дата: 11.05.06 14:25
Оценка:
dad>в чем проблема?

А определение-то v есть у тебя? А то в приведенном примере у тебя его нет.
А должно быть.
Of course, the code must be complete enough to compile and link.
Re[2]: атрибут static const - баг gcc ?
От: dad  
Дата: 11.05.06 14:26
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

dad>>в чем проблема?


L_L>А определение-то v есть у тебя? А то в приведенном примере у тебя его нет.

L_L>А должно быть.


static const int = -1;
разве не считается определением?
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[3]: атрибут static const - баг gcc ?
От: chem  
Дата: 11.05.06 14:31
Оценка: 6 (1)
Здравствуйте, dad, Вы писали:

dad>static const int = -1;

dad>разве не считается определением?

ISO/IEC 14882, пункт 9.4.2. Static data members [class.static.data]:

If a static data member is of const integral or const enumeration type, its declaration in the class definition can specify a constant-initializer which shall be an integral constant expression (5.19). In that case, the member can appear in integral constant expressions. The member shall still be defined in a namespace scope if it is used in the program and the namespace scope definition shall not contain an initializer.


Т.е. не считается
Re[3]: атрибут static const - баг gcc ?
От: quantez Россия  
Дата: 11.05.06 14:38
Оценка:
Здравствуйте, dad, Вы писали:

dad>Здравствуйте, Lorenzo_LAMAS, Вы писали:

dad>>>в чем проблема?
L_L>>А определение-то v есть у тебя? А то в приведенном примере у тебя его нет.
L_L>>А должно быть.
dad>static const int = -1;
dad>разве не считается определением?

Внутри определения класса такая строчка (если добавить имя переменной) является объявлением. Определение должно идти отдельно в том же пространстве имён, что и класс (но за пределами определения класса).

const int any::v;


Если статическая константа инициализируется внутри определения класса, её определение не должно содержать инициализации.

Определение должно быть только одно.
Re[4]: атрибут static const - баг gcc ?
От: dad  
Дата: 11.05.06 14:42
Оценка:
Здравствуйте, chem, Вы писали:

C>Здравствуйте, dad, Вы писали:


dad>>static const int = -1;

dad>>разве не считается определением?

C>ISO/IEC 14882, пункт 9.4.2. Static data members [class.static.data]:


C>

C>If a static data member is of const integral or const enumeration type, its declaration in the class definition can specify a constant-initializer which shall be an integral constant expression (5.19). In that case, the member can appear in integral constant expressions. The member shall still be defined in a namespace scope if it is used in the program and the namespace scope definition shall not contain an initializer.


ужас! он хоть ругался!
кстати comeau вот такой код тоже не берет:
struct f
{
   static const int a; 
};

int main()
{
   int b = f::a;
}


 line 3: error: a storage class may not be specified here
     static const int a;
     ^

"ComeauTest.c", line 8: error: identifier "f" is undefined
     int b = f::a;
             ^


не понимаю.
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re: атрибут static const - баг gcc ?
От: sch  
Дата: 11.05.06 14:48
Оценка:
dad>в чем проблема?

Скорее всего, где-то в исходниках ты берешь адрес v или что-то такое,
в этом случае v у тебя из compiletime константы превращается в обычную
статическую переменную.
Re[5]: атрибут static const - баг gcc ?
От: quantez Россия  
Дата: 11.05.06 14:52
Оценка:
Нужно добавить определение этой константы:

dad>struct f
dad>{
dad>   static const int a; 
dad>};

const int f::a = -1;

dad>int main()
dad>{
dad>   int b = f::a;
dad>}
Re: атрибут static const - баг gcc ?
От: HiSH Россия http://m0riarty.ya.ru
Дата: 11.05.06 14:57
Оценка:
Здравствуйте, dad, Вы писали:

dad>есть абстрактный класс (интерфейс)

dad>[c]

dad>struct any

dad>{
dad> static const int v = -1;
dad> virtual void doit() = 0;
dad>};

Ко всему вышесказанному могу добавить вариант решения "малой кровью":

struct any{
   static int get_v() const{
      return -1;
   }
}
Re[6]: атрибут static const - баг gcc ?
От: dad  
Дата: 11.05.06 15:02
Оценка:
Q>Нужно добавить определение этой константы:

неа.
попробуй

http://www.comeaucomputing.com/tryitout/

в c99 mode скмпильнуть этоти код.
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[2]: атрибут static const - баг gcc ?
От: dad  
Дата: 11.05.06 15:04
Оценка:
HSH>Ко всему вышесказанному могу добавить вариант решения "малой кровью":

малой кровью это будет так:
struct any{
 enim{ v = -1 };
};
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[7]: атрибут static const - баг gcc ?
От: quantez Россия  
Дата: 11.05.06 15:14
Оценка: +1
Здравствуйте, dad, Вы писали:

dad>попробуй

dad>http://www.comeaucomputing.com/tryitout/
dad>в c99 mode скмпильнуть этоти код.

C99 — это язык C. Приведённый в начале темы код — это C++, который естественно не компилируется в режиме C99.
Re[8]: атрибут static const - баг gcc ?
От: dad  
Дата: 11.05.06 15:29
Оценка:
Здравствуйте, quantez, Вы писали:

Q>Здравствуйте, dad, Вы писали:


dad>>попробуй

dad>>http://www.comeaucomputing.com/tryitout/
dad>>в c99 mode скмпильнуть этоти код.

Q>C99 — это язык C. Приведённый в начале темы код — это C++, который естественно не компилируется в режиме C99.


гы , а я грешным делом подумал, что это какая то версия стандарта от 99 года.
в любом случае — твой вариант и в c++-mode не работает

declaration is incompatible with "const int fue::a"
(declared at line 3)
int fue::a = 0;
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[9]: атрибут static const - баг gcc ?
От: Lorenzo_LAMAS  
Дата: 12.05.06 07:09
Оценка:
dad>declaration is incompatible with "const int fue::a"
dad> (declared at line 3)
dad> int fue::a = 0;

Это потому, что ты потерял const в определении (и это явно видно в сообщении об ошибке). А вот у quantez вроде const был.

Кстати, офтоп, это у тебя комо под линукс? Если да, то можно ли с его помощью компилить so ?
Of course, the code must be complete enough to compile and link.
Re[10]: атрибут static const - баг gcc ?
От: dad  
Дата: 12.05.06 09:54
Оценка:
dad>>declaration is incompatible with "const int fue::a"
dad>> (declared at line 3)
dad>> int fue::a = 0;

L_L>Это потому, что ты потерял const в определении (и это явно видно в сообщении об ошибке). А вот у quantez вроде const был.


L_L>Кстати, офтоп, это у тебя комо под линукс? Если да, то можно ли с его помощью компилить so ?


нет комо отсюда: http://www.comeaucomputing.com/tryitout/
а компилю gcc 4.0, компилилует все без варнингов, но либа, в итоге, не грузится.
значит, получается
что код:
struct fu
{
   static const int a = -1;
};


невалиден, хотя и компилируется?
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[11]: атрибут static const - баг gcc ?
От: Lorenzo_LAMAS  
Дата: 12.05.06 10:02
Оценка:
dad>невалиден, хотя и компилируется?

Валиден он. просто если у тебя где-то эта статическая константа используется, то она должна быть еще и определена (а не только объявлена в классе).
Of course, the code must be complete enough to compile and link.
Re[4]: атрибут static const - баг gcc ?
От: LaptevVV Россия  
Дата: 12.05.06 11:04
Оценка:
Здравствуйте, chem, Вы писали:

C>Здравствуйте, dad, Вы писали:


dad>>static const int = -1;

dad>>разве не считается определением?

C>ISO/IEC 14882, пункт 9.4.2. Static data members [class.static.data]:


C>

C>If a static data member is of const integral or const enumeration type, its declaration in the class definition can specify a constant-initializer which shall be an integral constant expression (5.19). In that case, the member can appear in integral constant expressions. The member shall still be defined in a namespace scope if it is used in the program and the namespace scope definition shall not contain an initializer.


C>Т.е. не считается


Тем не менее... Посмотрите на numeric_limits<>
Пункт 18.2.1.1 и далее...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[5]: атрибут static const - баг gcc ?
От: Lorenzo_LAMAS  
Дата: 12.05.06 11:22
Оценка: 6 (1)
LVV>Тем не менее... Посмотрите на numeric_limits<>
LVV>Пункт 18.2.1.1 и далее...

Посмотрите тогда еще и на 1.4/3, 1.4/4, 1.4/6
Of course, the code must be complete enough to compile and link.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.