Я выполняю рефакторинг своего проекта и хочу избавиться от всех анонимных пространств имен, включая классы, структуры, объединения.
Я хочу заменить их как можно проще их именованными эквивалентами.
Насколько я знаю, эквивалент для анонимного пространства имен:
Такой код:
namespace { namespace-body }
эквивалентно:
namespace unique { /* empty body */ }
using namespace unique;
namespace unique { namespace-body }
ссылка на сайт: Анонимная Неопределенность Пространства Имен
В таких простых случаях достаточно установить уникальное имя для 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».
Итак, как проще всего задать имя для анонимной структуры, объединения, класса для «примера задачи» и вообще для всех возможных примеров?
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];
};
Других решений пока нет …