Как заменить безымянную структуру, объединение, класс их именованными эквивалентами?
Я выполняю рефакторинг своего проекта и хочу избавиться от всех анонимных пространств имен, включая классы, структуры, объединения. Я хочу заменить их как можно проще их именованными эквивалентами. Насколько я знаю, эквивалент для анонимного пространства имен:
Такой код:
namespace { namespace-body }
эквивалентно:
namespace unique { /* empty body */ }
using namespace unique;
namespace unique { namespace-body }
ссылка: Anonymous Namespace Ambiguity
В таких простых случаях достаточно установить уникальное имя для struct, union, class:
1) такой код:
typedef struct { int a; void func() {}; } s1;
эквивалентно
typedef struct unique { int a; void func() {}; } s1;
2) такой код:
struct vec3 {
struct {
class
{
public:
void foo();
} bar;
float x, y, z;
} hotel;
float xyz[3];
};
int main() {
vec3 v;
return 0;
}
эквивалентно:
struct vec3 {
struct wigwam {
class skyscraper
{
public:
void foo();
} bar;
float x, y, z;
} hotel;
float xyz[3];
};
int main() {
vec3 v;
return 0;
}
Но что мне делать в таком случае, я понятия не имею
//Problem example
struct vec3 {
struct {
class
{
public:
void foo();
} bar;
float x, y, z;
} ;
float xyz[3];
};
int main() {
vec3 v;
v.x = 10; //direct access to the internal variable of anonymous struct.
return 0;
}
Как мы видим, доступ к члену анонимной структуры возможен так же, как эта анонимная структура является анонимным пространством имен. Но невозможно определить структуру подобным образом. Например:
struct unique { /* empty body */ }
using namespace unique;
struct unique { namespace-body }
Также невозможно определить пространство имен внутри структуры, поэтому невозможно просто заменить ключевое слово "struct" на "namespace" в этом примере.
Итак, как проще всего установить имя для анонимной структуры, объединения, класса для "примера задачи" и вообще для всех возможных примеров?
1 ответ
- Нет, именованное пространство имен не совпадает с анонимным пространством имен. Основное использование анонимных пространств имен заключается в том, чтобы весь их контент имел внутреннюю связь - это означает, что другие модули компиляции не могут ссылаться на него (например, вызывать функции). Поэтому не переименовывайте анонимные пространства имен. Это похоже на удаление
static
спецификатор из статической функции. typedef struct { int a; void func() {}; } s1;
может быть лучше замененоstruct s1 { int a; void func() {} };
- не требуется дополнительный "уникальный" идентификатор. То же самое относится и к союзу. Целыйtypedef struct { /*def*/ } Blah;
Конструкция фактически является остатком C и не обязательна в C++.
К вашему действительному примеру проблемы: Внутренняя структура не имеет большого эффекта, кроме, возможно, введения байтов заполнения. Так что это должно быть эквивалентно и делать работу:
//Problem example, revisited
struct vec3 {
class Bar {
public:
void foo();
};
Bar bar;
float x, y, z;
float xyz[3];
};