LINUX.ORG.RU

Эм, в Си можно инициализировать глобальную переменную глобальной переменной?

 


0

1

В C++ так можно, а в C ?

Я никак не могу найти как в стандарте С99 это описано .

Ответ: Нельзя!

★★★★★

Последнее исправление: Dron (всего исправлений: 2)

Глобальные переменные — зло, первый шаг на пути к goto (а также к безалкогольному пиву и резиновым женщинам) :)

unfo ★★★★★
()

А попробовать?

anonymous
()
Ответ на: комментарий от unfo

:) Да не в этом дело, просто интересно тут попробовал и бац. Ну, а вообще я не против глобалок, чего не скажу про goto.

Сказали что нельзя, вопрос закрыт.

Dron ★★★★★
() автор топика
Ответ на: комментарий от Dron

Это потому, что тебе интеллектуальное удовольствие получить хочется, а не задачу решить.

anonymous
()

Это описано в 6.7.8.4:

All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals.

unsigned ★★★★
()
Последнее исправление: unsigned (всего исправлений: 1)

Не будь дураком и заведи метод initStatics()

Иначе словишь потом кучу проблем типа «я пытаюсь инициализировать переменную через еще не инициализированную переменную».

trex6 ★★★★★
()
Ответ на: комментарий от trex6

Да у меня «барабанная дробъ» глобалки и инициализировать их нужно разными значениями, а магических чисел не хоца, завёл #define всё равно потом пригодятся.

Я прототип строю мне пока пофигу на правильность и красоту. Потом этим займусь.

Dron ★★★★★
() автор топика
Ответ на: комментарий от unsigned

All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals.

const int xxx = 123;

в данном случае xxx - это «константное выражение», но инициализировать им нельзя.

drBatty ★★
()
Ответ на: комментарий от Dron

Да у меня «барабанная дробъ» глобалки и инициализировать их нужно разными значениями, а магических чисел не хоца, завёл #define всё равно потом пригодятся.

ты с ЯП определись - ИМХО для C вполне годно, но для C++ лучше enum, желательно внутри класса. ИМХО.

drBatty ★★
()
Ответ на: комментарий от drBatty

в данном случае xxx - это «константное выражение»

Нет, это просто переменная - в общем случае не константное выражение (см. 6.6).

unsigned ★★★★
()
Ответ на: комментарий от unsigned

Нет, это просто переменная - в общем случае не константное выражение

в данном случае это константная глобальная переменная. Для компилятора она эквивалентна числу 123. Если например написать xxx+7, компилятор воспринимает это как константу 130. Т.ч. не очень понятно, почему gcc отплёвывается (впрочем, IRL это всё равно не нужно, и даже вредно).

drBatty ★★
()
Ответ на: комментарий от drBatty

компилятор воспринимает это как константу 130.

Можно прув? А то можно ведь «константный указатеть на это значение» -> скастовать в обычный -> с помощью последнего поменять.

anonymous
()
Ответ на: комментарий от anonymous

Можно прув?

возьми да проверь.

А то можно ведь «константный указатеть на это значение» -> скастовать в обычный -> с помощью последнего поменять.

нельзя

$ ./a.out 
Ошибка сегментирования
#include <stdio.h>

const int xxx1 = 10;


int main()
{
	const int *px;
	px = &xxx1;
	int *px2;
	px2 = (int*)px;
	*px2 = 17;
	printf("hello world\n%d\n", *px2);
	return 0;
}

0000000000400628 <main>:
  400628:	55                   	push   rbp
  400629:	48 89 e5             	mov    rbp,rsp
  40062c:	48 83 ec 10          	sub    rsp,0x10
  400630:	48 c7 45 f8 5c 07 40 	mov    QWORD PTR [rbp-0x8],0x40075c
  400637:	00 
  400638:	48 8b 45 f8          	mov    rax,QWORD PTR [rbp-0x8]
  40063c:	48 89 45 f0          	mov    QWORD PTR [rbp-0x10],rax
  400640:	48 8b 45 f0          	mov    rax,QWORD PTR [rbp-0x10]
  400644:	c7 00 11 00 00 00    	mov    DWORD PTR [rax],0x11
  40064a:	48 8b 45 f0          	mov    rax,QWORD PTR [rbp-0x10]
  40064e:	8b 00                	mov    eax,DWORD PTR [rax]
  400650:	89 c6                	mov    esi,eax
  400652:	bf 60 07 40 00       	mov    edi,0x400760
  400657:	b8 00 00 00 00       	mov    eax,0x0
  40065c:	e8 4f fe ff ff       	call   4004b0 <printf@plt>
  400661:	b8 00 00 00 00       	mov    eax,0x0
  400666:	c9                   	leave  
  400667:	c3                   	ret    
  400668:	0f 1f 84 00 00 00 00 	nop    DWORD PTR [rax+rax*1+0x0]
  40066f:	00 

падает очевидно на 400644

drBatty ★★
()
Ответ на: комментарий от drBatty

в данном случае это константная глобальная переменная

Да, и это не то же самое, что константное выражение.

Для компилятора она эквивалентна числу 123

Попробуй код:

const int n = 3;
int a[n];
и посмотри, насколько они эквивалентны. Я, в общем-то, ссылку на стандарт дал.

unsigned ★★★★
()
Ответ на: комментарий от unsigned

Да, и это не то же самое, что константное выражение.

согласен.

и посмотри, насколько они эквивалентны. Я, в общем-то, ссылку на стандарт дал.

а я в общем-то и не спорил.

drBatty ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.