struct A;
と宣言しておけば、実際の定義がなくても、
int f(A *a);
ポインタ型ならコンパイラを通すのにじゅうぶんです。

それでは、struct A の中に struct B があるときは
どのように宣言するのでしょうか?

// 正しい?
struct A;
typename struct A::B;
int g(A::B *b);

// 実際の定義
struct A {
 struct B {
  int i;
  int j;
 };

 int x;
 int y;
 B b;
};