Vaclav_ Ответов: 2

Как передать определение локальной сборки в глобальную переменную? ( С++)


Мне нужен глобальный массив C++.
Вот фрагмент его декларации
// has to be global
int fork_socket_fd[2]; //, child;
extern char fork_buf[1024];   // common message buffer
int main() {


Я определяю его как локальный и пытаюсь присвоить результаты глобальным...

Не может сделать компилятор счастлив.
Либо несколько определений, либо никаких определений...
Может быть, мне нужно разделить сокет-пару от вилки и иметь две отдельные функции.
Процессы форка будут выполняться в "цикле". Но сначала мне нужно решить глобальную проблему.

Мне бы не помешала помощь , кроме RTFM.

Что я уже пробовал:

//extern int fork_socket_fd[2];
void socketfork() {
	int local_fork_socket_fd[2];
	static const int parentsocket = 0;
	static const int childsocket = 1;
	pid_t pid;

	/* 1. call socketpair ... */
	socketpair(PF_LOCAL, SOCK_STREAM, 0, local_fork_socket_fd);

is this correct way to assign local definition to global ???

	fork_socket_fd[0] = local_fork_socket_fd[0];


will this code use the global array after it is defined correctly?


	/* 2. call fork ... */
	pid = fork();
	if (pid == 0) { /* 2.1 if fork returned zero, you are the child */
		close(fork_socket_fd[parentsocket]); /* Close the parent file descriptor */
		child(fork_socket_fd[childsocket]);
	} else { /* 2.2 ... you are the parent */
		close(fork_socket_fd[childsocket]); /* Close the child file descriptor */
		parent(fork_socket_fd[parentsocket]);
	}
	exit(0); /* do everything in the parent and child functions */
}

2 Ответов

Рейтинг:
2

Rick York

Вы должны объявить экземпляр в одном и только одно место. Затем везде, где осуществляется доступ к переменной, вы используете модификатор extern.

Другой способ-поместить это определение в заголовочный файл. У меня есть файл под названием Globals.h :

// the following needs to be defined ONCE to instatiate the globals
// it should be done prior to including this file.
//#define DEFINE_GLOBALS

#ifdef DEFINE_GLOBALS
#define	Global
#else
#define Global	extern
#endif
Затем вы включаете файл Globals.h во все свои модули, прежде чем объявлять его в переменных. Вы также можете поместить глобальные переменные в один файл. Я иногда делаю это и называю его GlobalData.h. В вашем случае, допустим, вы хотите, чтобы буфер и целые числа были глобальными переменными. Я бы сделал файл GlobalData.h, и он выглядел бы так :
// GlobalData.h - declare data global to the application

#include "Globals.h"

Global int fork_socket_fd[2]; // child
Global char fork_buf[1024];   // common message buffer
Затем в файле, где находится ваша основная функция, вы делаете это :
#define DEFINE_GLOBALS
#include "GlobalData.h"

int main()
...
и все остальные файлы, которые обращаются к глобальным данным, будут иметь только это :
#include "GlobalData.h"
Я делаю это всякий раз, когда мне нужны глобальные данные. Я часто обертываю глобальные данные в пространство имен, чтобы обозначить их природу. Вы можете расширить определения для поддержки инициализации, если хотите. Вот еще одно определение, которое вы можете добавить к глобалам.ч для этого :
// these macros facilitate declaring and initializing a global variable

#ifdef DEFINE_GLOBALS
#define GlobalVar(Type,Variable,Value)		Type Variable=Value
#else
#define GlobalVar(Type,Variable,Value)		extern Type Variable
#endif
Например, предположим, что у вас есть переменная для цвета всего текста в вашем приложении. Вы можете объявить его в своем файле GlobalData.h следующим образом :
GlobalVar( COLORREF, TextColor, RGB(255,255,255) );
и он будет инициализирован белым цветом и доступен для всех модулей, которые включают GlobalData.h

-редактировать- Я НЕ ВИДЕЛА ОТВЕТА РИЧАРДА. Ни в этот раз, ни в любой другой.


Richard MacCutchan

- Я НЕ ВИДЕЛА ОТВЕТА РИЧАРДА."
Не беспокойтесь, это распространенная проблема, когда более чем один ответ разрабатывается примерно в одно и то же время.

Vaclav_

Вы должны объявить экземпляр в одном и только одном месте. Затем везде, где осуществляется доступ к переменной, вы используете модификатор extern.

Идеальный.
Спасибо

Рейтинг:
0

Richard MacCutchan

Цитата:
Мне нужен глобальный массив C++.
Нет никакой разницы между массивом в языке Си и массивом в языке Си++. Но ваш код-это чистый C, а не C++.

Но, к слову, у вас есть следующее:
// has to be global
int fork_socket_fd[2]; //, child;
extern char fork_buf[1024];   // common message buffer

Когда вы объявляете что-то как extern, вы говорите компилятору, что он определен в другом месте. Но вы объявили его определенным в каком-то внешнем модуле, но добавили определение, поэтому компилятор запутался в том, что вы имеете в виду. Просто объявите его (без extern ключевое слово) как
char fork_buf[1024];   // common message buffer