Russian Qt Forum
Ноябрь 23, 2024, 17:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: static const struct {} const  (Прочитано 5447 раз)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« : Апрель 19, 2012, 19:22 »

Здравствуйте. Наткнулся в одном проекте (эппловский пример PortMapper) на интересную переменную:
Код
C
// Private IP address ranges. See RFC 3330.
static const struct {UInt32 mask, value;} const kPrivateRanges[] = {
   {0xFF000000, 0x00000000},       //   0.x.x.x (hosts on "this" network)
   {0xFF000000, 0x0A000000},       //  10.x.x.x (private address range)
   {0xFF000000, 0x7F000000},       // 127.x.x.x (loopback)
   {0xFFFF0000, 0xA9FE0000},       // 169.254.x.x (link-local self-configured addresses)
   {0xFFF00000, 0xAC100000},       // 172.(16-31).x.x (private address range)
   {0xFFFF0000, 0xC0A80000},       // 192.168.x.x (private address range)
   {0,0}
};
До этого в подобной форме (const после типа) видел только указатели (const char *const s) - с ними все понятно. А что означает const после типа для не-указателя?

Проект вообще написан на Objective-C, но я думаю это сишная конструкция.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Апрель 19, 2012, 22:34 »

Так это и есть указатель - массив же. Константный массив константных структур, думается так.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Апрель 19, 2012, 23:03 »

Ничего особого он не означает, просто const указано дважды, возможно компилятор вякнет варнингом. Массив - это "rvalue", его можно использовать как указатель но нельзя напр ++kPrivateRanges. Поэтому хоть const слева хоть справа - без разницы.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Апрель 19, 2012, 23:38 »

Так это и есть указатель - массив же.
и правда, не подумал про это
Ничего особого он не означает, просто const указано дважды, возможно компилятор вякнет варнингом.
клэнг промолчал, хотя я статический анализ не запускал - может там бы и сказал
Массив - это "rvalue", его можно использовать как указатель но нельзя напр ++kPrivateRanges.
вот разве что чтоб оградиться от такого и поставили 2 раза

заметил интересную вещь: сишный компилятор пропускает двойной конст для любого типа, плюсовой - только для указателей.
Код
C
#include <stdio.h>
int main (int argc, char const *argv[])
{
   const struct {int a;} const a = {1};
   printf("%d\n", a.a);
   return 0;
}
Код
Bash
kambala-macbook:~ kambala$ gcc untitled.c
kambala-macbook:~ kambala$ ./a.out
1
kambala-macbook:~ kambala$ g++ untitled.c
untitled.c: In function ‘int main(int, const char**)’:
untitled.c:4: error: duplicate ‘const’
результаты не изменятся если вместо структуры использовать pod-тип

исходный пример g++ тоже не пропускает кстати
« Последнее редактирование: Апрель 19, 2012, 23:46 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Апрель 20, 2012, 09:53 »

вот разве что чтоб оградиться от такого и поставили 2 раза
От чего "такого"?  Улыбающийся
Код
C++ (Qt)
ptr = theArray;  // массив справа, все хорошо
theArray = ...    // а так ничего не выходит
 
То есть массив - указатель, адрес, но менять этот адрес нельзя. Поэтому единственное к чему может быть приложено const - к значению, содержимому на что указывает адрес
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Апрель 20, 2012, 13:15 »

От чего "такого"?  Улыбающийся
но нельзя напр ++kPrivateRanges
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.133 секунд. Запросов: 23.