Forward declaration of a typedef in C++

Related searches

Why won't the compiler let me forward declare a typedef?

Assuming it's impossible, what's the best practice for keeping my inclusion tree small?

You can do forward typedef. But to do

typedef A B;

you must first forward declare A:

class A;

typedef A B;

Task #1490: Usage of forward declarations vs typedef vs #include , In C++, the header is typically where this sort of thing goes. Original Post by emitrax. julianjensen. 01:09 AM� In C++ (but not plain C), it’s perfectly legal to typedef a type twice, so long as both definitions are completely identical: // foo.h struct A{}; typedef A *PA; // bar.h struct A; // forward declare A typedef A *PA; void func(PA x); // baz.cc #include "bar.h" #include "foo.h" // We've now included the definition for PA twice, but it's ok since they're the same

For those of you like me, who are looking to forward declare a C-style struct that was defined using typedef, in some c++ code, I have found a solution that goes as follows...

// a.h
 typedef struct _bah {
    int a;
    int b;
 } bah;

// b.h
 struct _bah;
 typedef _bah bah;

 class foo {
   foo(bah * b);
   foo(bah b);
   bah * mBah;
 };

// b.cpp
 #include "b.h"
 #include "a.h"

 foo::foo(bah * b) {
   mBah = b;
 }

 foo::foo(bah b) {
   mBah = &b;
 }

typedef struct forward declaration, 2) If used on a line of its own, as in struct name ; , declares but doesn't define the struct name (see forward declaration below). In other contexts� forward declare typedef struct c (6) As Bill Kotsias noted, the only reasonable way to keep the typedef details of your point private, and forward declare them is with inheritance. You can do it a bit nicer with C++11 though. Consider this:

To "fwd declare a typedef" you need to fwd declare a class or a struct and then you can typedef declared type. Multiple identical typedefs are acceptable by compiler.

long form:

class MyClass;
typedef MyClass myclass_t;

short form:

typedef class MyClass myclass_t;

Struct declaration, Type Synonyms and Variables in C. The C grammar distinguishes typedef-name and identifier. Consider the following declarations: typedef struct { int x,y }� The typedef declaration provides a way to declare an identifier as a type alias, to be used to replace a possibly complex type name. The keyword typedef is used in a declaration, in the grammatical position of a storage-class specifier, except that it does not affect storage or linkage:

In C++ (but not plain C), it's perfectly legal to typedef a type twice, so long as both definitions are completely identical:

// foo.h
struct A{};
typedef A *PA;

// bar.h
struct A;  // forward declare A
typedef A *PA;
void func(PA x);

// baz.cc
#include "bar.h"
#include "foo.h"
// We've now included the definition for PA twice, but it's ok since they're the same
...
A x;
func(&x);

[PDF] Forward Declarations, In C++, classes can be forward-declared if you only need to use the pointer-to- that-class type (since all object pointers are the same size, and this is what the� When we use “typedef” keyword before struct <tag_name> like above, after that we can simply use type definition “status” in the C program to declare structure variable. Now, structure variable declaration will be, “status record”.

Because to declare a type, its size needs to be known. You can forward declare a pointer to the type, or typedef a pointer to the type.

If you really want to, you can use the pimpl idiom to keep the includes down. But if you want to use a type, rather than a pointer, the compiler has to know its size.

Edit: j_random_hacker adds an important qualification to this answer, basically that the size needs to be know to use the type, but a forward declaration can be made if we only need to know the type exists, in order to create pointers or references to the type. Since the OP didn't show code, but complained it wouldn't compile, I assumed (probably correctly) that the OP was trying to use the type, not just refer to it.

Forward declaration, typedef struct foo_t; Is there any way to declare a forward refernce for a tyepdef'd type? Thanks, Mike. May 18� typedef struct A A; // forward declaration *and* typedef void function( A *a ); Note that it is legal to reuse the struct name. Try changing the forward declaration to this in your code: typedef struct context context; It might be more readable to do add a suffix to indicate struct name and type name: typedef struct context_s context_t;

Forward Reference for Typedef'd Type? - C / C++, C forward declare typedef anonymous struct. Forward declarations of unnamed struct, Since you want to forward declare an anonymous struct, you can neither� "typedef struct" type structures, when we need to forward declaration of it i can't answer that question, but i feel compelled to point out that what you did here: when i tried to write forward declaration code of structure A in Temp.h header file which is . is NOT a forward declaration. You redefined the whole class. A forward

Forward declaration of a typedef in C++, The C++ Standard does not allow to use a typedef name with class names because otherwise there will be ambiguity. So if you need a forward declaration you should write struct mystruct

Comments
  • +1 in the end because while you technically can't "forward-typedef" (i.e. you can't write "typedef A;"), you can almost certainly accomplish what the OP wants to accomplish using your trick above.
  • But be aware, if the typedef changes you may change all those forward declarations too, which you might miss if the old and the new typedef using types with the same interface.
  • In general this is not a useful solution. For example if the typedef names a complex multilevel template type using a forward declaration this way is rather complex and difficult. Not to mention that it might require diving into implementation details hidden in default template arguments. And the end solution is a lengthy and unreadable code (especially when types come from various namespaces) very prone to change in original type.
  • Also this shows "implementation details" (even if not fully but still...) while the idea behind forward declaration was to hide them.
  • @windfinder: It does: template<class T> class A; typedef A<C> B;
  • @LittleJohn The problem with this solution is that the dummy-name _bah is not considered as a part of the public API. See forward delcare FILE.
  • How is this different from the most voted question? stackoverflow.com/a/804956/931303
  • @JorgeLeitão you don't see how it's different? It doesn't show how to do that in one line.
  • Maintenance No No. This sort of thing will bite you in the keister sooner or later.
  • @MarkStorer, at least the compiler will catch any difference and generate an error. I verified this with Visual C++.
  • Nice, but how do you define A fields in this way since A is empty by definition ?
  • Well, forward declarations of class types declare these types without knowledge of their size. Also, in addition to being able to define pointers and references to such incomplete types, functions can be declared (but not defined) which take parameters and/or return a value of such types.
  • Sorry I don't think that is a good assumption. This answer is beside the point. This is very much the case of typedef a forward declaration.