在typedef而不是局部变量上使用sizeof

时间:2014-11-26 15:30:34

标签: c++ c typedef sizeof type-alias

就像在这个例子中一样(在C中):

typedef int type;

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

输出始终是局部变量type的大小。

当C ++在每次使用结构之前删除了编写struct的需要时,它仍保留struct {type}语法并引入别名(class {type})以显式引用结构或类

示例(在C ++中):

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
}

我的问题是,是否有办法在C或C ++中明确引用typedef。或许像sizeof(typedef type)这样的东西(但这不起作用)。

我知道通常的做法是对变量和类型使用不同的命名约定来避免这些情况,但我仍然想知道是否有一种方法可以在langau中执行此操作或者如果没有。 :)

3 个答案:

答案 0 :(得分:9)

无法解决此问题,但如果您的结构是全局定义的,则可以使用此

范围解析运算符 ::

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

答案 1 :(得分:3)

在C ++中,使用:: operator得到答案为4.

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

::用于访问C ++中的全局变量。在C中,我没有直接的想法。你可以使用函数来完成它。

即使它不是类或结构,::运算符也可以工作。

typedef int type1;

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

这也将给出答案为4。

答案 2 :(得分: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;
}

C ++具有范围解析运算符::,您可以使用该运算符来引用使用限定名称的类型,即::typemy_namespace::type