Как в этом примере (в 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)
возможно (но это не работает).
Я знаю, что обычной практикой является использование различных соглашений о присвоении имен для переменных и типов, чтобы избежать подобных ситуаций, но я все же хотел бы знать, есть ли в пределах языка способ сделать это или нет. 🙂
Нет способа решить эту проблему, но если ваша структура определена глобально, вы можете использовать это,
Оператор разрешения области ::
,
printf("sizeof(type) == %zu\n", sizeof(::type));
В C ++ используйте оператор ::, чтобы получить ответ как 4.
printf("sizeof(::type) == %u\n", sizeof(::type));
:: используется для доступа к глобальным переменным в C ++. В Си нет прямого пути, я думаю. Вы можете сделать это с помощью функций.
Оператор :: работает, даже если это не класс или структура.
typedef int type1;
int main() {
int type1;
cout<<sizeof(::type1);
return 0;
}
Это также даст ответ как 4.
В С это невозможно. Вы скрываете тип 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
,