Как заменить неназванную структуру, объединение, класс их именованными эквивалентами?

Я выполняю рефакторинг своего проекта и хочу избавиться от всех анонимных пространств имен, включая классы, структуры, объединения.
Я хочу заменить их как можно проще их именованными эквивалентами.
Насколько я знаю, эквивалент для анонимного пространства имен:

Такой код:

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».

Итак, как проще всего задать имя для анонимной структуры, объединения, класса для «примера задачи» и вообще для всех возможных примеров?

0

Решение

  1. Нет, именованное пространство имен не совпадает с анонимным пространством имен. Основное использование анонимных пространств имен состоит в том, чтобы весь их контент имел внутреннюю связь — это означает, что другие модули компиляции не могут ссылаться на него (например, вызывать функции). Следовательно не переименовать анонимные пространства имен. Это похоже на удаление static спецификатор из статической функции.
  2. 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];
};
2

Другие решения

Других решений пока нет …