Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.58/95: Рейтинг темы: голосов - 95, средняя оценка - 4.58
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255

Инициализация статического массива

08.05.2011, 23:37. Показов 18487. Ответов 45
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!
Допустим, что имеется класс
C++
1
2
3
4
5
6
7
class A
{
....
public:
static int array[];
....
};
Как инициализировать массив в stdafx.h, если в нём будет 700 элементов, вводимых не вручную?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.05.2011, 23:37
Ответы с готовыми решениями:

Инициализация статического массива
Ребята, помогите пожалуйста. Не получается проинициализировать NULL-ами статиеский массив указателей. Пишет слудеющее (прикрепил скриншот)....

Инициализация статического поля
Добрый день, как объяснить необходимость объявить все статические поля, даже те у которых есть конструктор по умолчанию, вне класса до...

Инициализация статического члена из шаблонного класса
Добрый день. Есть код: template<int test> class Test { template<int a> struct Inner { static bool...

45
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
10.05.2011, 22:23
Студворк — интернет-сервис помощи студентам
Не помню точную формулировку, но с точки зрения стандарты выглядит что-то типа такого. Все обращения (чтение и запись) к переменной volatile должны быть ровно в том количестве и ровно в том порядке, как это вытекает из исходника. Такое же соотношение должно соблюдаться и между разными обращениями к volatile: т.е. чтения и записи различных volatile объектов или обращений по указателям нельзя переставлять и оптимизировать

Если есть, к примеру, исходник:

C
1
2
3
4
5
6
7
8
9
10
vaoltile int x;
volatile int y;
 
x = 0;
y = 0;
for (i = 0; i < 10; i++)
{
  x++;
  y++;
}
То без модификатора volatile оптимизатор превратил бы этот код в

C
1
2
x = 10;
y = 10;
но с volatile оптимизатор не может сделать вообще ничего. Даже переставить местами обращение к x и y.

volatile обычно используют для адресов, которые являются портами ввода-вывода (т.е. являются не обычной памятью, а связанной с аппаратурой). Чтение из такого адреса может поменять состояние порта ввода-вывода, а потому компилятор не должен ничего оптимизировать с такими обращениями
2
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
12.05.2011, 20:48  [ТС]
Evg, значит volatile была создан сугубо радио определённых целей, связанных с аппаратурой?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
12.05.2011, 21:48
Цитата Сообщение от alexsvk Посмотреть сообщение
Evg, значит volatile была создан сугубо радио определённых целей, связанных с аппаратурой?
Грубо говоря, да. Си проектировался как замена ассемблера, т.е. язык по сути низкого уровня
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
12.05.2011, 21:59  [ТС]
C++
1
2
3
4
5
6
7
8
9
*.h
...
const wchar_t lpszClassName[];
...
 
*.cpp
#include *.h
const wchar_t cWnd::lpszClassName [] ="habadubada";
...
Результат:
>c:\users\alexsvk\documents\visual studio 2010\projects\api\schupak\ch1\listing_2\ listing_2\cwnd.h(20): warning C4200: nonstandard extension used : zero-sized array in struct/union
1> Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array
1>c:\users\alexsvk\documents\visual studio 2010\projects\api\schupak\ch1\listing_2\ listing_2\cwnd.cpp(3): error C2761: 'const wchar_t cWnd::lpszClassName[]' : member function redeclaration not allowed

т.е. инициализация не static полей вне объявления класса невозможна?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
12.05.2011, 23:07
"nonstandard extension used : zero-sized array in struct/union"
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
12.05.2011, 23:24  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
"nonstandard extension used : zero-sized array in struct/union"
ага, значит указание размера обязательно по текущему стандарту?

Хм...
C++
1
2
*.h
const wchar_t lpszClassName [10] = L"cWndClass";
1>c:\users\alexsvk\documents\visual studio 2010\projects\api\schupak\ch1\listing_2\ listing_2\cwnd.h(20): error C2864: 'cWnd::lpszClassName' : only static const integral data members can be initialized within a class
1>c:\users\alexsvk\documents\visual studio 2010\projects\api\schupak\ch1\listing_2\ listing_2\cwnd.cpp(10): error C2439: 'cWnd::lpszClassName' : member could not be initialized
1> c:\users\alexsvk\documents\visual studio 2010\projects\api\schupak\ch1\listing_2\ listing_2\cwnd.h(20) : see declaration of 'cWnd::lpszClassName'
1> Hello2.cpp
1>c:\users\alexsvk\documents\visual studio 2010\projects\api\schupak\ch1\listing_2\ listing_2\cwnd.h(20): error C2864: 'cWnd::lpszClassName' : only static const integral data members can be initialized within a class
1> Generating Code...
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
13.05.2011, 09:56
В .h надо extern указывать. Без extern у тебя описание (declaration) превратилось в определение (definition). И именно про это место выдавалась ошибка из поста #24 (если внимательно посмотреть на привязку ошибки к исходнику)
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
13.05.2011, 11:49  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
В .h надо extern указывать. Без extern у тебя описание (declaration) превратилось в определение (definition). И именно про это место выдавалась ошибка из поста #24 (если внимательно посмотреть на привязку ошибки к исходнику)
Но extern - аналог static. Почему при указании static на сработало?
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
13.05.2011, 11:54
extern ни разу не аналог static - кто это вам сказал?
static - это прямое указание размещения переменной в static storage. А extern - это указание о том, что в данной единице трансляции переменная не определена. Это линкер найдет ее в другом модуле и "подклеит".
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
13.05.2011, 12:02  [ТС]
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
extern ни разу не аналог static - кто это вам сказал?
static - это прямое указание размещения переменной в static storage. А extern - это указание о том, что в данной единице трансляции переменная не определена. Это линкер найдет ее в другом модуле и "подклеит".
Массивы в заголовочных файлах
39 пост
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
13.05.2011, 12:24
Цитата Сообщение от alexsvk Посмотреть сообщение
Т.е. описание static внутри тела класса - это по сути дела описание (т.е. extern) обычной внешней переменной (но по имени она доступна только внутри класса, другой принципиальной разницы нет).
Давайте отделим мух от котлет.
Во-первых, речь там идет о КОНСТАНТАХ.
Во-вторых, static-переменные могут быть описаны не только в классе, но и в функции, и в пространстве имен, и даже просто в файле (deprecated по стандарту). И все они размещаются в static storage. А вот доступность-видимость их зависит от того, где они описаны. Если статическая переменная описана непосредственно в файле, то ее область видимости - этот файл (что и является устаревшим - вместо подобного подхода ввели пространства имен).
Что касается констант, константа, описанная вне каких-либо конструкций на уровне файла, видна только в этом файле. Даже нестатическая. Чтобы ее видеть в другой единице трансляции - надо как раз и прописать extern.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
13.05.2011, 13:00
Цитата Сообщение от alexsvk Посмотреть сообщение
Там речь шла о static-членах класса. Обычная переменная с модификатором static - это совсем другое. У разработчиков языков программирования есть некое маниакальное желание использовать одно и то же ключевое слово для обозначения разных конструкций. Т.е. в твоём случае и в случае по ссылке слово static применяется в разных контекстах и имеет разный смысл. По поводу твоего static'а почитай тут Отличие static от объявление переменных ДО функции main
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
13.05.2011, 13:01  [ТС]
Добавил к коду extern в *.h
1>------ Build started: Project: Listing_2, Configuration: Debug Win32 ------
1> cWnd.cpp
1>c:\users\alexsvk\documents\visual studio 2010\projects\api\schupak\ch1\listing_2\ listing_2\cwnd.h(20): error C2071: 'cWnd::lpszClassName' : illegal storage class
1>c:\users\alexsvk\documents\visual studio 2010\projects\api\schupak\ch1\listing_2\ listing_2\cwnd.h(20): warning C4200: nonstandard extension used : zero-sized array in struct/union
1> Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array
1>c:\users\alexsvk\documents\visual studio 2010\projects\api\schupak\ch1\listing_2\ listing_2\cwnd.cpp(10): error C2439: 'cWnd::lpszClassName' : member could not be initialized
1> c:\users\alexsvk\documents\visual studio 2010\projects\api\schupak\ch1\listing_2\ listing_2\cwnd.h(20) : see declaration of 'cWnd::lpszClassName'
1> Hello2.cpp
1>c:\users\alexsvk\documents\visual studio 2010\projects\api\schupak\ch1\listing_2\ listing_2\cwnd.h(20): error C2071: 'cWnd::lpszClassName' : illegal storage class
1>c:\users\alexsvk\documents\visual studio 2010\projects\api\schupak\ch1\listing_2\ listing_2\cwnd.h(20): warning C4200: nonstandard extension used : zero-sized array in struct/union
1> Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array
1> Generating Code...
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
13.05.2011, 13:05
Может исходник всё-таки покажешь? И желательно целиком
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
13.05.2011, 13:09  [ТС]
cWnd.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef _cWnd_H_
#define _cWnd_H_
 
#include <Windows.h>
 
class cWnd
{
public:
    cWnd(LPCTSTR, HINSTANCE, int, LRESULT (WINAPI *pWndProc)(HWND,UINT,WPARAM,LPARAM),\
        LPCTSTR lpszMenuName = NULL, int x = CW_USEDEFAULT, int y = 0, int width = CW_USEDEFAULT, int height = 0,\
        UINT uCstyle = CS_HREDRAW | CS_VREDRAW, DWORD dwWstyle = WS_OVERLAPPEDWINDOW, HWND hWndParent = NULL);
    ~cWnd();
    HWND getHwnd()
    {
        return hWnd;
    }
    public:
    HWND hWnd;
    WNDCLASSEX wc;
    extern const wchar_t lpszClassName [];
};
 
#endif
cWnd.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "cWnd.h"
#include <Windows.h>
 
const wchar_t lpszClassName [] = L"cWndClass";
 
cWnd::cWnd(LPCTSTR lpszWndName, HINSTANCE hInstance, int nCmdShow,\
           LRESULT (WINAPI *pWndProc)(HWND,UINT,WPARAM,LPARAM),\
           LPCTSTR lpszMenuName, int x, int y, int width, int height,\
           UINT uCstyle, DWORD dwWstyle, HWND hWndParent)
{
    wc.cbSize         = sizeof(wc);
    wc.style          = uCstyle;
    wc.lpfnWndProc    = pWndProc;
    wc.cbWndExtra     = 0;
    wc.cbClsExtra     = 0;
    wc.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.hCursor        = LoadCursor(NULL,IDC_ARROW);
    wc.hIcon          = LoadIcon(NULL,IDI_APPLICATION);
    wc.hIconSm        = LoadIcon(NULL,IDI_APPLICATION);
    wc.hInstance      = hInstance;
    wc.lpszClassName  = lpszClassName;
    wc.lpszMenuName   = lpszMenuName;
 
    if(!RegisterClassEx(&wc))
    {
        wchar_t msg [40] = L"Cannot register class ";
        wcscat_s(msg,lpszClassName);
        MessageBox(NULL, msg, L"Error", MB_OK);
        return;
    }
 
    hWnd = CreateWindow(lpszClassName, lpszWndName, dwWstyle, x, y, width, height, hWndParent, (HMENU)NULL, hInstance, (LPARAM)NULL);
 
    if(!hWnd)
    {
        wchar_t msg [40] = L"Cannot create window ";
        wcscat_s(msg,lpszWndName);
        MessageBox(NULL, msg, L"Error", MB_OK);
        return;
    }
 
    ShowWindow(hWnd, nCmdShow);
}
 
 
cWnd::~cWnd()
{
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include "cWnd.h"
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MSG msg;
 
    cWnd mainWnd(L"Hello2 application", hInstance, nCmdShow, WndProc);
 
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return msg.wParam;
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;
    RECT rc;
    int userResponse;
 
    switch(uMsg)
    {
    case WM_PAINT:
        hDC = BeginPaint(hWnd, &ps);
        GetClientRect(hWnd, &rc);
        DrawText(hDC, L"Aloha, world!", -1, &rc, DT_VCENTER | DT_CENTER | DT_SINGLELINE);
        EndPaint(hWnd, &ps);
        break;
    case WM_CLOSE:
        userResponse = MessageBox(hWnd, L"Do you really want to quit?",L"Attention!", MB_YESNO | MB_ICONQUESTION);
        if(userResponse == (int)IDYES)
            DestroyWindow(hWnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
 
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
 
    return 0;
}
И ещё один момент.
То есть static - модификатор имеет следующие применения:
1. Как глобальная переменная, обращение к которой возможно из определённого блока (если в stdafx.h, то для всей программы; если в функции, то внутри этой ф-ции и т.д.), но при этом предыдущее значение сохраняется при каждом входе в этот блок.
2. Как следствие из 1-го, переменная static будет видна только в модуле, где она определена (т.е. имеется множество файлов, но переменная определена в файле f1.h, то только в этом файле к ней будет доступ открыт)
3. Как поле класса. Переменная глобальна, но видна только методам данного класса. Глобальность при этом подразумевает время жизни, равное времени жизни всей программы.
Правильно ли выстроил понятие о static'e?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
13.05.2011, 14:22
Цитата Сообщение от alexsvk Посмотреть сообщение
1>c:\users\alexsvk\documents\visual studio 2010\projects\api\schupak\ch1\listing_2\ listing_2\cwnd.h(20): error C2071: 'cWnd::lpszClassName' : illegal storage class
Модификатор extern должен применяться только к обычным переменным, но не элементам класса. Ты раньше приводил какие-то вырезки из исходников, я думал, что ты работаешь с глобальной переменной. Внутри класса надо именно static писать (видимо, с указанием размера - я не силён в Си++). На будущее - сразу выкладывай исходники целиком, меньше будет проблем сдогадыванием, что же у тебя написано

Цитата Сообщение от alexsvk Посмотреть сообщение
1. Как глобальная переменная, обращение к которой возможно из определённого блока (если в stdafx.h, то для всей программы; если в функции, то внутри этой ф-ции и т.д.), но при этом предыдущее значение сохраняется при каждом входе в этот блок.
2. Как следствие из 1-го, переменная static будет видна только в модуле, где она определена (т.е. имеется множество файлов, но переменная определена в файле f1.h, то только в этом файле к ней будет доступ открыт)
Файл *.h ты трактуешь как нечто особенное. Но ничего особенного в нём нет, он просто целиком подключается в том месте, где написано #include (более подробно читай Препроцессорные директивы в C/C++ (#include, #define и прочее) раздел 2). Т.е. если ты поместишь static переменную в .h файл, то это будет означать, что в каждом модуле, который подключает этот .h файл, будет своя копия этой переменной (а не одна на все модули). В остальном верно

Цитата Сообщение от alexsvk Посмотреть сообщение
3. Как поле класса. Переменная глобальна, но видна только методам данного класса. Глобальность при этом подразумевает время жизни, равное времени жизни всей программы.
Правильно
1
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
13.05.2011, 16:03  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
...я не силён в Си++...

Не по теме:

Над аватарой прямое противоречие!:)



Непросвещённые моменты:
  1. Представление о модификаторе extern. Значит, переменная не определяется, а лишь описывается физически (компоновщик определит её при подключении всех файлов программы)? Отличия от static модификатора вне классовых конструкций, грубо говоря (класс памяти отличен - static storage), отсутствуют?
  2. Вопрос остаётся открытым. Как без модификатора static инициализровать массив константных Unicode-символов?
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
13.05.2011, 17:37
Цитата Сообщение от alexsvk Посмотреть сообщение
Представление о модификаторе extern. Значит, переменная не определяется, а лишь описывается физически (компоновщик определит её при подключении всех файлов программы)? Отличия от static модификатора вне классовых конструкций, грубо говоря (класс памяти отличен - static storage), отсутствуют?
Вопрос нифига не понял.

"extern int x;" - переменная определена где-то в другом месте
"int x;" - переменная определена в данном модуле, но видна из других модулей (если там написать extern)
"static int x;" - переменная определена в данном модуле, но из других модулей недоступна, даже если в других модулях написать extern

Цитата Сообщение от alexsvk Посмотреть сообщение
Вопрос остаётся открытым. Как без модификатора static инициализровать массив константных Unicode-символов?
К статической инициализации переменных static ортогонален (т.е. это две независимые вещи). Если у тебя в классе, то

C++
1
2
3
4
5
6
class A
{
  static wchar_t a[];
};
 
wchar_t A::a[] = L"aaaa";
1
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
13.05.2011, 18:00  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Вопрос нифига не понял.

"extern int x;" - переменная определена где-то в другом месте
"int x;" - переменная определена в данном модуле, но видна из других модулей (если там написать extern)
"static int x;" - переменная определена в данном модуле, но из других модулей недоступна, даже если в других модулях написать extern



К статической инициализации переменных static ортогонален (т.е. это две независимые вещи). Если у тебя в классе, то

C++
1
2
3
4
5
6
class A
{
  static wchar_t a[];
};
 
wchar_t A::a[] = L"aaaa";
Значит, у переменной с модификатором extern уникальное имя в тех модулях, где она используется? И как компоновщик собирает проект с переменными-extern?

На счёт класса, здесь используется static. Интерес же был на счёт использования const БЕЗ static.
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
13.05.2011, 18:34
Цитата Сообщение от Evg Посмотреть сообщение
Там речь шла о static-членах класса. Обычная переменная с модификатором static - это совсем другое. У разработчиков языков программирования есть некое маниакальное желание использовать одно и то же ключевое слово для обозначения разных конструкций. Т.е. в твоём случае и в случае по ссылке слово static применяется в разных контекстах и имеет разный смысл. По поводу твоего static'а почитай тут Отличие static от объявление переменных ДО функции main
Пожелание у меня к вам - не надо говорить об эквивалентности того и сего в абсолюте. Лучше говорить об эквивалентности с точки зрения размещения в памяти. Но неэквивалентности с точки зрения области видимости. Так будет правильней.
На РСДН вас за подобные вольности съели бы с потрохами...

Добавлено через 8 минут
Цитата Сообщение от alexsvk Посмотреть сообщение
Значит, у переменной с модификатором extern уникальное имя в тех модулях, где она используется? И как компоновщик собирает проект с переменными-extern?

На счёт класса, здесь используется static. Интерес же был на счёт использования const БЕЗ static.
1. Любая переменная должна быть определена единственный раз в соответствующей области видимости. Когда ты в каком-то файле объявляешь глобальную переменную, то она попадает в глобальное неименованное пространство имен. Например,
C++
1
int a;
2. Чтобы эту глобальную переменную можно было использовать в другом модуле файле, надо в этом другом модуле файле прописать
C++
1
extern int a;
. Это - НЕ определение, это - объявление.
Вот можно почитать из моей книжки:
Межмодульные переменные и функции
Начнем с простых переменных. Допустим, у нас есть два модуля A.cpp и B.cpp. В модуле A определена целая переменная i вне всех классов и функций

int i = 2;

Такая переменная называется глобальной. В файле A она видна от точки определения и до конца файла. Однако в модуле B эта переменная не видна. И если вдруг нам потребуется в модуле B присвоить ей другое значение, у нас возникнут некоторые проблемы. Просто написать

i = 1;

нельзя – компилятор при обработке модуля B «не видит» модуль A и ничего не знает об определенной там переменной, поэтому получим сообщение о неопределенной переменной. Написать

int i = 1;

тоже нельзя — это является определением (повторным). Компилятор-то «возражать» не будет — он транслирует модули по-отдельности, а вот линкер будет «воротить нос» и сообщит, что одна и та же переменная определена дважды. Для таких случаев в С++ включено специальное ключевое слово extern. В модуле B надо объявить переменную следующим образом:

extern int i;

После этого можно использовать переменную i в файле B любым разрешенным способом. Например, присвоить новое значение

i = 1;

Однако попытка совместить объявление с присвоением значения

extern int i = 1;

является ошибкой — такая запись является определением, и мы опять получим сообщение от линкера о повторном определении.

ПРИМЕЧАНИЕ
Хотя это ключевое слово в стандарте определено как один из четырех классов хранения, проще понимать его как обозначение «внешнего» имени для данного модуля. Имя называется внешним по отношению к модулю, если объект с этим именем не определен в данном модуле.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.05.2011, 18:34

Инициализация константного статического объекта - члена класса
Здравствуйте, у меня возникла проблема с инициализацией статического объекта, который является членом класса. Этот объект должен быть...

Инициализация статического члена std::vector в шаблонном классе
есть класс myclass , владеющий классом struct template&lt;class T&gt; class myclass { struct mystruct {}; public: static...

Размер статического массива
Можно ли задавть размер статического массива во время работы программы? Если нет, то почему?#include &lt;iostream&gt; using namespace...

Обнуление статического массива
Нужна помощь с обнулением массива,который записан в файл и выведен на экран Надо его обнулить и снова записать в файл и на экран вывести ...

Из статического массива в динамический
Здравствуйте . Помогите , пожалуйста , переделать эту программу(сортировку) , чтобы она работала с динамическим массивом . #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
Сукцессия 20. Война автоботов. Делаем ставки. Лёд против "пш-пш!".
anaschu 11.07.2026
Битва ИИ в ризосфере: Как мы скрестили жесткие ОДУ, закон Фика и «подземный шантаж» Уважаемые коллеги! Хочу поделиться уникальным опытом ведения междисциплинарной компьютерной разработки. Прямо. . .
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
Просветление в 5 секунд
kumehtar 10.07.2026
Андрей Веретенников выдал фразу недавно: "Вам не обязательно кем-то себя считать"
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru