Подтвердить что ты не робот

Использование 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 или С++. Возможно, что-то вроде sizeof(typedef type) (но это не работает).

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

4b9b3361

Ответ 1

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

Оператор разрешения области действия ::.

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

Ответ 2

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

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

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

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

typedef int type1;

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

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

Ответ 3

В C это невозможно. Вы скрываете тип 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;
}

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