+ 52
Define namespaces and structs after main
I was wondering if there is a way to define namespaces and structs after the main function, not including external files with them declared there, just by maybe declaring them before the main, the same way you do with functions. Thank you!
6 ответов
+ 12
Very good question.
Forward declarations appear to be possible for structs (and classes), but with a catch.
struct foo; //fwd decl
struct bar {
foo obj; // error: incomplete type
foo* obj; // ok
};
struct foo {
// foo def here
};
Forward declarations only tell the compiler that something exists, but not how much memory to allocate to the initialization of an object of its type. A pointer to the object, on the other hand, has a fixed memory size which can be resolved during compile time.
As for forward declarations for namespaces, a brief lookup doesn't show any examples. I'm sticking with "not possible" for now. If there's a way, I'm clearly oblivious to it.
+ 8
Thank you so much, this really helped! Hope there was a way for namespaces too xD
+ 6
Thanks a lot for the explanation. I just wanted to find if I could make the main function more visible by defining everithing after it.
+ 5
Sorry, just one more thing. Now, doing like this
struct foo;
int main() {
foo *var;
return 0;
}
struct foo {
int num;
};
it doesn't give me error. The question is: how do I use the structured type variable from here the same way I would if I defined the struct before the main function? (I can't find a way to legaly access to and manipulate the foo.num integer variable of the example)
+ 2
A forward declaration is usually used in headers to solve cyclic dependencies or to improve compile times. In actual code such as your example you cannot use it, as from the moment you do more than declaration you need to know the specifics (and: var in your example is probably optimised away as it is not used).
As for why you'd want forward declaration of namespaces? I have no idea but to me it doesn't make sense. Namespaces are not more than fences that enable you to have multiple types, etc with the same name. A namespaces therefor is nothing that you can declare...
0
You can put the rest in other files.