From the C99 standard, 6.7(5):
A declaration specifies the interpretation and attributes of a set of identifiers. A *definition* of an identifier is a declaration for that identifier that:
* for an object, causes storage to be reserved for that object;
* for a function, includes the function body;
* for an enumeration constant or typedef name, is the (only) declaration of the
identifier.
From the C++ standard, 3.1(2):
A declaration is a *definition* unless it declares a function without specifying the function's body, it contains the extern specifier or a linkage-specification and neither an initializer nor a function-body, it declares a static data member in a class declaration, it is a class name declaration, or it is a typedef declaration, a using-declaration, or a using-directive.
Then there are some examples.
So interestingly (or not, but I'm slightly surprised by it), `typedef int myint;` is a definition in C99, but only a declaration in C++.