2014-11-26 21 views
13

jak w tym przykładzie (w C)Stosując sizeof na typedef zamiast zmiennej lokalnej

typedef int type; 

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

wyjście jest zawsze wielkość zmiennej lokalnej type.

Kiedy C++ usuwa potrzebę napisania struct przed każdym użyciem struktury nadal zachowane składnię struct {type} i wprowadzono alias (class {type}) jednoznacznie odnoszą się do struktury lub klasy.

Przykład (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 
} 

pytanie jest, jeśli jest to sposób wyraźnie odnosi się do typedef w języku C i C++. Coś jak może sizeof(typedef type) (ale to nie działa).

Wiem, że powszechną praktyką jest używanie różnych konwencji nazewnictwa dla zmiennych i typów w celu uniknięcia tego rodzaju sytuacji, ale chciałbym się dowiedzieć, czy istnieje sposób wewnątrz języka, aby to zrobić, lub jeśli nie ma takiej możliwości. :)

+2

Twój typ-plik-zakres oraz obiekt "char" z blokiem mają tę samą nazwę. Poprawka polega na zmianie nazwy jednego z nich, aby można było się do nich odnieść jednoznacznie. ("typ" to i tak niewłaściwa nazwa dla typu, chyba że faktycznie reprezentuje typ, np. w kodzie implementującym kompilator lub interpreter). –

+0

to nie będzie czysto kompilować z powodu tego wiersza: char type; który staje się char int; który podniesie alias lub ostrzeżenie o maskowaniu.W każdym przypadku printf zawsze używa zmiennej lokalnej "type" – user3629249

Odpowiedz

9

Nie ma sposobu, aby rozwiązać ten jeden, ale jeśli struktura jest zdefiniowana globalnie można użyć tego

rozdzielczości Zakres Operator::.

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

@AlexFarber: Tak, właśnie to zauważyłem. Pytanie to dotyczy więc całkowicie zakresu. –

+0

@Venkatesh: Tak, możesz. Ale nie zarówno typedef, jak i zmienna. Jest to jednak legalne: 'int main() {struct type {}; int typu; } ' –

3

W C++ używać :: operatorowi uzyskać odpowiedź jako 4.

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

:: służy do uzyskiwania dostępu do zmiennych globalnych w C++. W C nie ma bezpośredniego sposobu myślenia. Możesz to zrobić za pomocą funkcji.

Operator :: działa, nawet jeśli nie jest klasą lub strukturą.

typedef int type1; 

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

Będzie to również dać odpowiedź jako 4.

+0

Nie ma typu" struct type ". 'type' nie jest klasą. Czy możesz używać programisty typu 'struct' na rzeczach, które nie są klasami? –

+0

Zaktualizowałem swoją odpowiedź. @BenVoigt – shintoZ

+0

@jrok proszę przeczytać pytanie, dla kodu C++, nie użył on typedef i struct. – shintoZ

3

w C to nie jest możliwe. Ukrywasz typ type. Nie można używać go jako typ po zadeklarować 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; 
} 

Jeśli jednak utworzyć alias dla type lub zadeklarować type przed zadeklarować char można użyć, aby:

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++ ma operatora rozdzielczości zakresu ::, którego można użyć do odniesienia do typu przy użyciu kwalifikowanej nazwy, tj. ::type lub my_namespace::type.

+0

Akceptuję tę odpowiedź, ponieważ uważam, że jest to najlepsza odpowiedź. Mówi mi, jak odwołać się do "typedef", który jest w cieniu i nie polega na "typie" będącym w zasięgu globalnym. – wefwefa3