Powodem, o którym mowa w cytacie z Stroustrup, jest historyczne. W języku C, musisz musi zawsze prefiksować nazwę struktury z struct
; nazwa struktury (jak nazwa związków lub wyliczeń) jest nazywana znacznikiem i żyje w zupełnie innej nazwie niż inne symbole. A więc rzeczy takie jak:
struct stat
{
// ...
};
int stat(char const* filename, struct stat* buf);
są całkowicie legalne. (Powyższe jest w rzeczywistości częścią Posix).
W C++, nazwa klasy (zadeklarowanego przy class
, struct
lub union
) lub enum jest w tej samej przestrzeni nazw, jak wszystko inne, i w przeciwieństwie do C, można napisać takie rzeczy jak:
struct MyClass {};
MyClass variableName;
nie byłoby to legalne C. W C, druga linia musiałaby być:
struct MyClass variableName;
Problemem jest to, że C++ wymaga, aby móc korzystać z interfejsów zdefiniowane w C (podobnie jak interfejs Posix, powyżej). Więc C++ definiuje kilka specjalnych reguł, aby na to pozwolić: możesz podać zmienną lub funkcję, a typ klasy taką samą. Gdy to zrobisz, zmienna lub funkcja nazwa ma pierwszeństwo, i ukrywa nazwę klasy , z wyjątkiem „opracowanego typu specyfikatorami” (tj class
, struct
, union
lub enum
, a następnie symbol), gdzie nazwy non-type są ignorowane podczas wyszukiwania.
Być może właśnie to prowadzi do potrzeby przedkładania 'struct'. Czy możesz wskazać źródło swojego cytatu? –
@KarthikT Bjarne Stroustrup - Język programowania C++ 4. wydanie – Oleksiy
Istnieje mnóstwo sposobów na spowodowanie semantycznej dwuznaczności i zamieszania, obowiązek unikania tych kłamstw z programistą, a nie z projektantem języka. Nie ma wieloznaczności składniowej, ponieważ prefix 'struct' sugerowałby, że mówimy o' struct'. – Dukeling