Russian Qt Forum

Программирование => С/C++ => Тема начата: kambala от Апрель 19, 2012, 19:22



Название: static const struct {} const
Отправлено: kambala от Апрель 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, но я думаю это сишная конструкция.


Название: Re: static const struct {} const
Отправлено: Авварон от Апрель 19, 2012, 22:34
Так это и есть указатель - массив же. Константный массив константных структур, думается так.


Название: Re: static const struct {} const
Отправлено: Igors от Апрель 19, 2012, 23:03
Ничего особого он не означает, просто const указано дважды, возможно компилятор вякнет варнингом. Массив - это "rvalue", его можно использовать как указатель но нельзя напр ++kPrivateRanges. Поэтому хоть const слева хоть справа - без разницы.


Название: Re: static const struct {} const
Отправлено: kambala от Апрель 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++ тоже не пропускает кстати


Название: Re: static const struct {} const
Отправлено: Igors от Апрель 20, 2012, 09:53
вот разве что чтоб оградиться от такого и поставили 2 раза
От чего "такого"?  :)
Код
C++ (Qt)
ptr = theArray;  // массив справа, все хорошо
theArray = ...    // а так ничего не выходит
 
То есть массив - указатель, адрес, но менять этот адрес нельзя. Поэтому единственное к чему может быть приложено const - к значению, содержимому на что указывает адрес


Название: Re: static const struct {} const
Отправлено: kambala от Апрель 20, 2012, 13:15
От чего "такого"?  :)
но нельзя напр ++kPrivateRanges