Использование sizeof для typedef вместо локальной переменной

Как в этом примере (в C):

typedef int type;

int main()
{
char type;
printf("sizeof(type) == %zu\n", sizeof(type)); // Outputs 1
}

Выводом всегда является размер локальной переменной type,

Когда С ++ убрал необходимость писать struct перед каждым использованием структуры она все еще сохраняла struct {type} синтаксис и введенный псевдоним (class {type}) явно ссылаться на структуру или класс.

Пример (на С ++):

struct type {
int m;
};

int main()
{
char type;
printf("sizeof(type) == %u\n", sizeof(type)); // Outputs 1
printf("sizeof(struct type) == %u\n", sizeof(struct type)); // Outputs 4
printf("sizeof(class type) == %u\n", sizeof(class type)); // Outputs 4
}

У меня вопрос, есть ли способ явно обратиться к typedef в C или C ++. Что-то вроде sizeof(typedef type) возможно (но это не работает).

Я знаю, что обычной практикой является использование различных соглашений о присвоении имен для переменных и типов, чтобы избежать подобных ситуаций, но я все же хотел бы знать, есть ли в пределах языка способ сделать это или нет. 🙂

13

Решение

Нет способа решить эту проблему, но если ваша структура определена глобально, вы можете использовать это,

Оператор разрешения области ::,

printf("sizeof(type) == %zu\n", sizeof(::type));
9

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

В C ++ используйте оператор ::, чтобы получить ответ как 4.

printf("sizeof(::type) == %u\n", sizeof(::type));

:: используется для доступа к глобальным переменным в C ++. В Си нет прямого пути, я думаю. Вы можете сделать это с помощью функций.

Оператор :: работает, даже если это не класс или структура.

typedef int type1;

int main() {
int type1;
cout<<sizeof(::type1);
return 0;
}

Это также даст ответ как 4.

3

В С это невозможно. Вы скрываете тип type, Вы не можете использовать его как тип после того, как объявите char:

typedef int type;

int main(void) {
char type;
type t;      // error: expected ‘;’ before ‘t'
printf( "%d %d\n", sizeof type, sizeof t );
return 0;
}

Однако, если вы создаете псевдоним для type или объявить type прежде чем объявить char Вы можете использовать это:

int main(void) {
type t;
char type;
printf( "%d %d\n", sizeof type, sizeof t );
return 0;
}int main(void) {
typedef type type_t;
char type;
printf( "%d %d\n", sizeof type, sizeof( type_t ) );
return 0;
}

C ++ имеет оператор разрешения области видимости :: который вы можете использовать для ссылки на тип, используя полное имя, т.е. ::type или же my_namespace::type,

3
По вопросам рекламы [email protected]