На unixes нет никакого реального способа надежного выполнения этого. В Unix с традиционной файловой системой Unix можно открыть файл и затем удалить связь с ним (удалите его запись из каталога), и используйте его, в которой точке имя не хранится нигде. Кроме того, потому что файл может иметь несколько hardlinks в файловую систему, каждое из имен эквивалентны, поэтому после того как у Вас есть просто открытый дескриптор, это не было бы ясно, к какому имени файла необходимо отобразиться назад.
Так, Вы можете делать это на Win32 с помощью других ответов, но если когда-либо необходимо портировать приложение на среду Unix, Вам не повезет. Мой совет Вам состоит в том, чтобы осуществить рефакторинг Вашу программу, если это возможно, так, чтобы Вам не была нужна ОС, чтобы смочь поддержать открытый ресурс к соединению имени файла.
Похоже, вы пытаетесь иметь локальные классы в каждом исходном файле с тем же именем. В C ++ вы можете инкапсулировать локальные классы в анонимное пространство имен:
namespace {
class StaticClass
{
public:
void setMemberA(int m) { a = m; }
int getMemberA() const { return a; }
private:
static int a;
};
int StaticClass::a = 0;
} // close namespace
void first()
{
StaticClass statc1;
static1.setMemberA(2);
}
Оператор
int StaticClass::a = 0;
фактически выделяет память для переменной, поэтому его следует записывать только один раз.
Что касается вашего замечания, вы, вероятно, путаете два разных использования статическое
ключевое слово. В C static используется для обозначения «использовать внутреннюю связь», это означает, что имя переменной или функции не будет видно за пределами единицы трансляции, в которой оно было определено.
В классах используется static
для определения членов класса, то есть переменных или методов, которые не относятся к конкретному экземпляру класса. В этом случае хранилище для статической переменной должно быть где-то выделено (поскольку оно не является частью какого-либо экземпляра), но, конечно, только в одном месте.
Ниже приводится определение статического элемента данных. Это должно происходить только в одном файле, который скомпилирован и затем связан.
int StaticClass::a = 0;
Если у вас есть несколько таких определений, это как если бы у вас было несколько функций, сначала называемых
. Они будут конфликтовать, и компоновщик будет жаловаться.
Я думаю, вы ошибаетесь со статическими членами, применяемыми к переменным области имен пространства имен. На уровне пространства имен static задает внутреннюю связь переменной или ссылки. Но на уровне области видимости класса (при применении к члену) он станет статическим членом - членом, который привязан к классу, а не к каждому объекту отдельно. Тогда это больше не имеет ничего общего со значением C для слова «статический».
StaticClass
требует места для хранения a
, статической переменной, которая будет использоваться всеми экземплярами класса - для этого есть две строки, по одной в каждой. файл. Удаление одного исправит ошибку компоновщика.