On Sun, Apr 11, 2021 at 7:33 PM Rakhi Kumari <[email protected]> wrote:
> Hi, > > I'm working on PROTON-2370 > <https://issues.apache.org/jira/browse/PROTON-2370> and created the draft > PR <https://github.com/apache/qpid-proton/pull/309> for the same. While > working on it I was seeing code snippets similar to "struct pn_session_t;", > I haven't seen this C++ syntax before. Can you please tell me what it means? > Hey, I am not sure what exactly you are asking, so I am going to give a long-winded answer, sorry. A struct is a carry-over from the C language. So the answer depends on whether you are compiling your code as C or C++. In C++ a struct it is like a class where the default access modifier is public:, unless you declare it otherwise. In a C++ class, all members are private: by default, unless you declare otherwise. When you compile as C, a struct can only have data members, no methods. That's because C is not an object-oriented language, so the C++ syntax to add methods is not supported. If you want to have objects in C, you can define functions that take the struct (or pointer to a struct, more like) as their first argument (for consistency), name the functions in a consistent way, and only manipulate the struct using these functions; which is exactly what Proton-c does. You cannot have inheritance in C, though. Well, actually, you can use a library to add some object support to C, for example https://en.wikibooks.org/wiki/C_Programming/GObject, but Proton-c does not use any of that. > > https://github.com/apache/qpid-proton/blob/df978869030bb811b5e9cd99f6c390c9ca9bf97c/cpp/src/proton_bits.hpp#L42 > That on line 42 is a forward declaration of a struct. You can do this instead of actually including the header file, and then you can use the type as a reference (pointer). You cannot use it as a value because with only a forward-declaration, the compiler does not know the size of the struct. Usually it is better to simply include the header; you may not want to do that 1) for compile efficiency, if the header file is very big 2) if the header file is not available, as e.g. in this case in Proton, the header is called "engine-internal.h"; private headers are one way in C to achieve encapsulation; here the C++ binding is breaking encapsulation, to some (small) degree, hopefully for good reasons. > I'm trying to understand the above in order to fix the build error I'm > getting on the same PR. In case you already know what's wrong here, can you > please guide me? > > > https://github.com/apache/qpid-proton/blob/df978869030bb811b5e9cd99f6c390c9ca9bf97c/cpp/include/proton/tag.hpp#L42 > > > [image: image.png] > Please don't include pictures in e-mails to the mailing list; the mailing list is afaik striping them, the only reason I see this is that you sent me a CC in addition 'P Simply copy-paste the text from the terminal. The text color does not matter. I'm going to comment on the PR directly, just because I can 'P BTW, thanks for posting the PR, it helps with debugging. I can simply pull your code in its entirety and play with it... -- Mit freundlichen Grüßen / Kind regards Jiri Daněk
