JUCE api macro?

Hi all, since getting back into C++ and using the juce framework, I've seen a couple of things that I just don't recall from years ago.What is exactly is the JUCE api macro?  What's it's purpose?  Only reason I know it's a macro is because the tool tip tells me it is. 

I've used the #define many times in the past, but I don't recall ever seeing anything like this before.

class JUCE_API  Component  : public MouseListener

http://www.juce.com/forum/topic/what-exactly-do-juceapi-and-jucecalltype-do

JUCE_API ( https://github.com/julianstorer/JUCE/blob/master/modules/juce_core/system/juce_StandardHeader.h#L119 )

I understand it's a macro, but, what is the reason for putting it between class and component?  


I'm not sure to understand your question. 


Is it:


- About visibility in general?
- The position of the macro?
- Why JUCE classes have visibility attribute?
- Why a macro is used to define that attribute?

 

In case few links that respond to some of the question above.

Visibility attributes may be applied to functions, variables, templates, and C++ classes. If a class is marked as hidden, all of its member functions, static member variables, and compiler-generated metadata, such as virtual function tables and RTTI information, are also hidden.

http://gcc.gnu.org/wiki/Visibility

https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/CppRuntimeEnv/Articles/SymbolVisibility.html

Well, now that you mentioned it. The first three would be greatly apprecited. I understand the basics of macros, but don't undertand them fully enough to understand why JUCE is using them.  


1. and 3. are well explained in the Apple link i put in my previous post.
2. TBH i don't know. That is Jules's personal taste.
4. This usage of macros is not specific to C++ nor JUCE. It is largely used for C code also. It uses conditional compilation ( http://www.eskimo.com/~scs/cclass/notes/sx9c.html ) for blocks of code, attributes of functions, function names called. In that case it controls the visiblity accordingly to the platform (Mac / Windows...) and the target (a DLL or an executable). It is commonly used also to modify function called for Release or Debug build process.