C ++ Как происходит связь между статической переменной в двух разных проектах - PullRequest
1 голос
/ 14 декабря 2010

Я новичок в C ++ Linux, и у меня есть вопрос, как это работает,

header.h

static int arr [2] [2] = {some values}

lib.cpp - включает файл header.h и создает .so

source.cpp - включает в себя тот же файл header.h (и динамически связывает lib.so) и во время линковки выдает ошибку .gnu.linkonce_t

Итак, чтобы избежать этого, я пошел с этим подходом,

header.h

class x {

static int arr [2] [2];
}

lib.cpp - включает файл header.h и создает .so

source.cpp -

int x::arr = {define some values}

включает в себя тот же файл header.h и НЕ выдает ошибку ссылки

Ответы [ 2 ]

1 голос
/ 03 января 2011

Прежде всего, вы никогда не должны определять статическую глобальную переменную в заголовочном файле. Определение статической переменной вне класса имеет совершенно иной смысл, чем определение статической переменной внутри класса. Это очень запутанно, но так работает C ++.

В C ++ есть как минимум четыре варианта использования ключевого слова static:

1) Статическая глобальная переменная вне класса будет глобальной только для кода, который может напрямую «видеть» переменную, как правило, потому что они находятся в одном файле. Это делает переменную локальной для файла. Как уже упоминалось выше, вы не должны помещать один из них в заголовок. Если вы это сделаете, вы получите несколько экземпляров одной и той же переменной. По одному в каждом файле, который включает в себя заголовок. Изменения одного не повлияют на другие в других файлах.

2) Статическая глобальная функция имеет то же значение, что и статическая глобальная переменная в # 1. В общем, это означает, что функция будет вызываться только из файла, в котором она объявлена. Как и статическая глобальная переменная, если вы реализуете статическую глобальную функцию в заголовочном файле, вы получите несколько копий в конечном исполняемом файле. Однако, в отличие от статической глобальной переменной, если вы поместите статическую глобальную функцию определение в заголовочный файл, у вас будут проблемы с связыванием результирующих объектных файлов.

3) Статическая переменная в классе означает, что для всех экземпляров класса будет только одна копия этой переменной.

4) Статическая функция-член в классе будет иметь доступ только к статическим переменным в этом классе. Все остальные данные класса будут недоступны из статической функции-члена. Однако вы можете вызвать статическую функцию-член без экземпляра класса. например A::func().

Возможно, вы захотите либо использовать статическую переменную класса, либо поместить определение extern в заголовочный файл, например так:

extern int arr[2][2];

Затем в файле реализации, где фактически создается экземпляр переменной, в виде нестатической переменной, например:

int arr[2][2] = {some values};

Убедитесь, что вы понимаете разницу между объявлением / определением и реализацией / реализацией. Это концепции хранения в C / C ++.

1 голос
/ 14 декабря 2010

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

Подробнее об этом здесь .

Ваше решение с размещением статического массива в классе хорошо, но при некоторых обстоятельствах может привести к фиаско инициализации статического порядка, поэтому вы должны быть осторожны при использовании статических переменных-членов класса.

Если вы предпочитаете 1-й способ, вы можете объявить массив как переменную extern и определить его в исходном файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...