реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> WinAVR и адрес статической функции, странная ошибка
ARV
сообщение Jun 6 2011, 09:45
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Код
static basis sum(uint8_t arg_cnt, void **args){
        basis result = 0;
        for(;arg_cnt--;*args++){
               result += evalute(args);
        }
        return result;
    }
    

#define num(x)    ((x) & 0xFF), (((x) >> 8) & 0xFF), (((x) >> 16UL) & 0xFF), (((x) >> 24UL) & 0xFF)


#define adr(x)    ((uint16_t)(x) & 0xFF), ((uint16_t)(x) & 0xFF00) >> 8
    
    uint8_t massiv[] = {
            TOC_VAR, 0,
                TOC_FUNC,adr(sum), 0, 3,
                    TOC_NUMBER, num(99UL),
                    TOC_NUMBER, num(1UL),
                    TOC_VAR, 0,
            TOC_END
    };

не получается занести в массив адрес функции sad.gif пишет - не константа sad.gif с чего бы это вдруг?


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 6 2011, 13:08
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (ARV @ Jun 6 2011, 12:45) *
пишет - не константа sad.gif с чего бы это вдруг?
Вероятно, хочет явного приведения адреса функции к типу uintptr_t : TOC_FUNC,adr((uintptr_t)sum),


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ARV
сообщение Jun 6 2011, 19:17
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(Сергей Борщ @ Jun 6 2011, 17:08) *
Вероятно, хочет явного приведения адреса функции к типу uintptr_t : TOC_FUNC,adr((uintptr_t)sum),
не, похоже не так... http://530.ru/wwwboards/mcontrol/3029/messages/1226781.shtml


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



--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 6 2011, 20:14
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



static убрать


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ARV
сообщение Jun 7 2011, 04:34
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(zltigo @ Jun 7 2011, 00:14) *
static убрать

убрать статик - не помогает

явно привести тип к любому int - не помогает


определять массив с указателями в PROGMEM - помогает.



--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 7 2011, 06:48
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



CODE
static void test()
{

}

#define adr(x)    ((uint16_t)(x) & 0xFF), ((uint16_t)(x) & 0xFF00) >> 8

uint8_t Test[] =
{
        adr(test),
        (uintptr_t)test >> 0,
        (uintptr_t)test >> 8,
        (uintptr_t)test >> 16,
        (uintptr_t)test >> 24,
};


QUOTE
Compiling: main.cpp
main.cpp:50: warning: right shift count >= width of type
main.cpp:51: warning: right shift count >= width of type

что и следовало ожидать - размер uintptr_t - 2 байта. Так что ищите проблему в другом месте.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ARV
сообщение Jun 7 2011, 09:33
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(Сергей Борщ @ Jun 7 2011, 10:48) *
Так что ищите проблему в другом месте.


Код
#include "plc_editor.h"
static void foo(void){
}

#define adr(x)    ((uint16_t)(x) & 0x00FF), ((uint16_t)(x)>>8)

uint8_t array[] = {
        adr(foo)
};
Цитата
Building file: ../plc_editor.c
Invoking: AVR Compiler
avr-gcc -Wall -g3 -gdwarf-2 -O0 -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega32 -DF_CPU=16000000UL -MMD -MP -MF"plc_editor.d" -MT"plc_editor.d" -c -o"plc_editor.o" "../plc_editor.c"
../plc_editor.c:27: error: initializer element is not constant
../plc_editor.c:27: error: (near initialization for 'array[0]')
../plc_editor.c:28: error: initializer element is not constant
../plc_editor.c:28: error: (near initialization for 'array[1]')
make: *** [plc_editor.o] Error 1
и где искать?


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 7 2011, 10:12
Сообщение #8


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Код
static void foo1(void){}
static void foo2(void){}

typedef union
{
    void (*foo)(void);
    uint8_t bytes[sizeof(void*)];
} union_t;

const union_t array[] =
{
    foo1,
    foo2
};
Смените подход. И объявите union вашего пакета данных и массива байт.

Цитата(Сергей Борщ @ Jun 7 2011, 10:48) *
что и следовало ожидать - размер uintptr_t - 2 байта. Так что ищите проблему в другом месте.
C++ != С


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 7 2011, 10:19
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (ARV @ Jun 7 2011, 12:33) *
и где искать?
Бага. В режиме С++ все компилится. И массив из указателей на функции в режиме С создается. А вот на приведении указателя с целому - спотыкается. Пишите баг-репорт.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 7 2011, 10:26
Сообщение #10


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Сергей Борщ @ Jun 7 2011, 14:19) *
Бага. В режиме С++ все компилится. И массив из указателей на функции в режиме С создается. А вот на приведении указателя с целому - спотыкается. Пишите баг-репорт.

Думаю что с багрепортом рановато. Нужно стандарт изучить на сей счёт ибо и RealView-MDK-ARM - тоже даёт предупреждение, но проект собирает.
Хотя и по моему мнению разницы быть не должно, что приводишь к целому что нет.

2ТС:
Cмените диалект с gnu99 на c99. Есть разница?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ARV
сообщение Jun 7 2011, 11:01
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Код
static void foo(void){
}

static uint8_t array[] = {foo};
Цитата
Building file: ../plc_editor.c
Invoking: AVR Compiler
avr-gcc -Wall -g3 -gdwarf-2 -O0 -fpack-struct -fshort-enums -std=c99 -funsigned-char -funsigned-bitfields -mmcu=atmega32 -DF_CPU=16000000UL -MMD -MP -MF"plc_editor.d" -MT"plc_editor.d" -c -o"plc_editor.o" "../plc_editor.c"
../plc_editor.c: At top level:
../plc_editor.c:95: warning: initialization makes integer from pointer without a cast
../plc_editor.c:95: error: initializer element is not computable at load time
../plc_editor.c:95: error: (near initialization for 'array[0]')
make: *** [plc_editor.o] Error 1


ну на счет предупреждений - бог с ними, но пишет ведь ошибку - элемент не может быть вычислен на этапе компиляции! в run-time я могу записать туда адрес любой функции, не проходит только инициализация


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 7 2011, 11:40
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (ARV @ Jun 7 2011, 14:01) *
не проходит только инициализация


CODE
static void foo(void){
}

typedef void (*fptr)();
fptr array[] = {
        foo
};
Компиляция проходит. Проблема начинается при попытке занести в массив целых чисел.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ARV
сообщение Jun 7 2011, 12:15
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(Сергей Борщ @ Jun 7 2011, 15:40) *
Компиляция проходит. Проблема начинается при попытке занести в массив целых чисел.
совершенно верно! причем если массив uint16_t - то тоже пролетает на ура (с варнингами о преобразовании указателя в целое), а вот uint8_t дает ошибку...
то есть это БАГ? по идее ведь батовый массив или не байтовый - какая разница для Си?


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 7 2011, 14:35
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (ARV @ Jun 7 2011, 15:15) *
совершенно верно! причем если массив uint16_t - то тоже пролетает на ура (с варнингами о преобразовании указателя в целое),
А если сделать явное приведение - не ругается.

QUOTE (ARV @ Jun 7 2011, 15:15) *
а вот uint8_t дает ошибку...
то есть это БАГ?
Да. Причем бага именно avr-gcc. Потому что именно avr-gcc ругается (проверил и на 3.4.6 и на 4.3.3), в то время как mingw-gcc прекрасно компилит.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Maddy
сообщение Jun 10 2011, 07:38
Сообщение #15


Участник
*

Группа: Validating
Сообщений: 56
Регистрация: 15-10-06
Пользователь №: 21 335



Хм ... а можно дурацкий вопрос ? откуда компилятор возмет адрес функции что-бы вычислить значение adr(x) ?? IMHO адрес может проявиться только на этапе сборки (если не выпендриваться с __attribute__ ) ?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 10 2011, 08:59
Сообщение #16


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Maddy @ Jun 10 2011, 10:38) *
Хм ... а можно дурацкий вопрос ? откуда компилятор возмет адрес функции что-бы вычислить значение adr(x) ??
А откуда он его берет, чтобы сделать вызов func()? Естественно, он вставляет какую-то ссылку, которую затем связывает линкер. Как это реализовано в потрохах - его личное дело.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Maddy
сообщение Jun 10 2011, 10:55
Сообщение #17


Участник
*

Группа: Validating
Сообщений: 56
Регистрация: 15-10-06
Пользователь №: 21 335



ну таки я об этом и говорю - тут на этапе формирования массива автор пытается пользовать данные ,которых еще нет . Если просто класть указатель на функцию - да , ld автоматом подсунет нужный адрес , но автор-то хочет вычеслений ... И как быть бедному gcc ?

Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 10 2011, 12:22
Сообщение #18


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Maddy @ Jun 10 2011, 13:55) *
И как быть бедному gcc ?
Так же, как и в случае с указателем на функцию. Почему у gcc для других платформ с этим проблем не возникает?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Maddy
сообщение Jun 10 2011, 13:21
Сообщение #19


Участник
*

Группа: Validating
Сообщений: 56
Регистрация: 15-10-06
Пользователь №: 21 335



Хм ...
Код
long handleTimersISR(void);

static U8 data[]={0,0,((U32)handleTimersISR >>24)& 0xff,((U32)handleTimersISR >>16)& 0xff,((U32)handleTimersISR >>8)& 0xff,((U32)handleTimersISR )& 0xff };


Цитата
..\072-cxxV2\fwcommon\boards\072-Cxx\bsp_hw_timersInit.c:17: error: initializer element is not constant
..\072-cxxV2\fwcommon\boards\072-Cxx\bsp_hw_timersInit.c:17: error: (near initialization for 'data[2]')
..\072-cxxV2\fwcommon\boards\072-Cxx\bsp_hw_timersInit.c:17: error: initializer element is not constant
..\072-cxxV2\fwcommon\boards\072-Cxx\bsp_hw_timersInit.c:17: error: (near initialization for 'data[3]')
..\072-cxxV2\fwcommon\boards\072-Cxx\bsp_hw_timersInit.c:17: error: initializer element is not constant
..\072-cxxV2\fwcommon\boards\072-Cxx\bsp_hw_timersInit.c:17: error: (near initialization for 'data[4]')
..\072-cxxV2\fwcommon\boards\072-Cxx\bsp_hw_timersInit.c:17: error: initializer element is not constant
..\072-cxxV2\fwcommon\boards\072-Cxx\bsp_hw_timersInit.c:17: error: (near initialization for 'data[5]')


И я ему верю wink.gif Ибо все-таки адрес функции хоть и константа , но на этом этапе не определена wink.gif
Цитата
avr32-gcc.EXE (AVR_Toolchain_3.0_124) 4.3.3


или опять приколы Атмеловцев ?

НЕ winAVR но gcc ж)

Сообщение отредактировал Maddy - Jun 10 2011, 13:22
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 10 2011, 13:47
Сообщение #20


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Сергей Борщ @ Jun 10 2011, 18:22) *
Почему у gcc для других платформ с этим проблем не возникает?

У gcc с указателями иногда очень странные отношения.
Вот пример:
Код
struct rec1 {
    int field1;
    int field2;
};

#define prec1 ((rec1 *) 0x10000)

static const int field2addr = (uint32_t)&prec1->field2;    // строка 1

class testcase2
{
    static const int field2addr = (uint32_t)&prec1->field2;   // строка 2
};


Строку 1 - проглатывает, а строку 2 - нет:
Цитата
tests.cpp:64:43: error: a cast to a type other than an integral or enumeration type cannot appear in a constant-expression
tests.cpp:64:50: error: '->' cannot appear in a constant-expression
tests.cpp:64:50: error: '&' cannot appear in a constant-expression

Почему так - не понимаю...


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Maddy
сообщение Jun 10 2011, 14:06
Сообщение #21


Участник
*

Группа: Validating
Сообщений: 56
Регистрация: 15-10-06
Пользователь №: 21 335



мдя послали wink.gif А кстати - вариант с offsetof не подходит для данного извращения ?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 10 2011, 15:04
Сообщение #22


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Через него и выкрутился:
Код
    static const int field2addr = 0x10000 + offsetof(rec1, field2);

Но это несколько коряво, ибо пришлось вытаскивать константу 0x10000 (в реале это адрес регистровой структуры).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
alx2
сообщение Jun 14 2011, 05:08
Сообщение #23


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(AHTOXA @ Jun 10 2011, 18:47) *
У gcc с указателями иногда очень странные отношения.

Строку 1 - проглатывает, а строку 2 - нет:
Почему так - не понимаю...

Потому что (статические) члены классов не инициализируют таким образом, как у Вас в строке 2. Вот такой вариант:
Код
class testcase2
{
   static const int field2addr;
};
const int testcase2::field2addr = (uint32_t)&prec1->field2;
gcc компилирует без замечаний.


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 14 2011, 06:05
Сообщение #24


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Статические int-ы легко инициализируются таким образом:
Код
class testcase2
{
    static const int test_static_const_int = 0x12345;
};

Кроме того, в enum-ах инициализация указателем тоже не проходит, на
Код
class testcase2
{
    enum { field2addr = (uint32_t)&prec1->field2 };
};

-- ругается точно так же. Так что дело не в статике. Но за способ обхода - спасибоsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
alx2
сообщение Jun 14 2011, 11:17
Сообщение #25


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(AHTOXA @ Jun 14 2011, 11:05) *
Статические int-ы легко инициализируются таким образом:
Код
class testcase2
{
    static const int test_static_const_int = 0x12345;
};

Нашел соответствующее место в спецификации языка, вроде бы все правильно. Такая форма требует constant expression в правой части, а constant expression, в свою очередь, может содержать только литералы, перечисления, const переменные интегральных типов и sizeof(). Указатели под перечисленное не подпадают.

И еще в constant expression допускаются приведения только к интегральным типам или перечислениям, поэтому компилятор совершенно справедливо ругается на (rec1 *)0x10000.

Сообщение отредактировал alx2 - Jun 14 2011, 11:20


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 14 2011, 12:42
Сообщение #26


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(alx2 @ Jun 14 2011, 17:17) *
Нашел соответствующее место в спецификации языка
Языка - C++? А когда мы объявляем вне класса, то срабатывает совместимость с Си, а там это можно? Если так, то немного проясняется, спасибо.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
alx2
сообщение Jun 15 2011, 04:59
Сообщение #27


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(AHTOXA @ Jun 14 2011, 17:42) *
Языка - C++?
Да, конечно.
Цитата(AHTOXA @ Jun 14 2011, 17:42) *
А когда мы объявляем вне класса, то срабатывает совместимость с Си, а там это можно?
Ничего не "срабатывает". Просто то, что у Вас в строке 1 и в строке 2 - это две разные семантические конструкции, и они подчиняются разным правилам языка C++. В строке 1 инициализатор не обязан быть integral constant expression, в строке 2 - обязан.

Сообщение отредактировал alx2 - Jun 15 2011, 05:09


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 15 2011, 05:11
Сообщение #28


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(alx2 @ Jun 15 2011, 10:59) *
в строке 1 и в строке 2 - это две разные семантические конструкции

А в чём разница? Можно какую-нибудь цитату из стандарта?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
alx2
сообщение Jun 15 2011, 09:14
Сообщение #29


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(AHTOXA @ Jun 15 2011, 10:11) *
Можно какую-нибудь цитату из стандарта?

Конечно. Подпункт 4 пункта 9.4.2 по версии ISO:
Цитата
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).

А это из подпункта 1 пункта 5.19:
Цитата
An integral constant-expression can involve only literals (2.13), enumerators, const variables or static
data members of integral or enumeration types initialized with constant expressions (8.5), non-type
template parameters of integral or enumeration types, and sizeof expressions. ... Only type conversions
to integral or enumeration types can be used. In particular, except in sizeof expressions, functions, class objects,
pointers, or references shall not be used,...


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 15 2011, 09:47
Сообщение #30


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(alx2 @ Jun 15 2011, 15:14) *
Конечно. Подпункт 4 пункта 9.4.2 по версии ISO:

На мой взгляд, эта цитата не о том, что это две разные семантические конструкции. А только лишь о том, что на инициализацию статической константной переменной-члена внутри объявления класса накладываются некоторые дополнительные ограничения.
В любом случае, спасибо за цитату, теперь понятно в чём дело.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
dxp
сообщение Jun 15 2011, 10:28
Сообщение #31


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(AHTOXA @ Jun 15 2011, 16:47) *
На мой взгляд, эта цитата не о том, что это две разные семантические конструкции. А только лишь о том, что на инициализацию статической константной переменной-члена внутри объявления класса накладываются некоторые дополнительные ограничения.

В С++ статические члены-данные должны быть объявлены вне определения класса - именно в этот момент под них выделяется память. Объявление такой переменной внутри класса - это просто помещение её в пространство имён этого класса. Поэтому инициализация тут не катит - ведь объекта самой этой статической переменной физически при объявлении объекта класса не создаётся, поэтому и инициализировать там нечего. А для констант такое допускается по той причине, что они (константы) имеют по умолчанию внутреннее связывание и память под них вообще как правило не выделяется - получается чисто конструкция времени компиляции - типизированный литерал.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 20:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01686 секунд с 7
ELECTRONIX ©2004-2016