问一个问题, 我C好像好菜.....
弱弱的问一下, 这样写是什么意思,只要解释语法就好了....
#define DLL_API extern "c" _declspec(dllexport)
Microsoft Specific The extended attribute syntax for specifying storage-class information uses the __declspec keyword, which specifies that an instance of a given type is to be stored with a Microsoft-specific storage-class attribute listed below. Examples of other storage-class modifiers include the static and extern keywords. However, these keywords are part of the ANSI specification of the C and C++ languages, and as such are not covered by extended attribute syntax. The extended attribute syntax simplifies and standardizes Microsoft-specific extensions to the C and C++ languages. Grammar decl-specifier: __declspec ( extended-decl-modifier-seq ) extended-decl-modifier-seq: extended-decl-modifieropt extended-decl-modifier extended-decl-modifier-seq extended-decl-modifier: align(#) allocate("segname") appdomain deprecated dllimport dllexport jitintrinsic naked noalias noinline noreturn nothrow novtable process property({get=get_func_name|,put=put_func_name}) restrict selectany thread uuid("ComObjectGUID") White space separates the declaration modifier sequence. Examples appear in later sections. Extended attribute grammar supports these Microsoft-specific storage-class attributes: align, allocate, appdomain, deprecated, dllexport, dllimport, jitintrinsic, naked, noalias, noinline, noreturn, nothrow, novtable, process, restrict, selectany, and thread. It also supports these COM-object attributes: property and uuid. The dllexport, dllimport, naked, noalias, nothrow, property, restrict, selectany, thread, and uuid storage-class attributes are properties only of the declaration of the object or function to which they are applied. The thread attribute affects data and objects only. The naked attribute affects functions only. The dllimport and dllexport attributes affect functions, data, and objects. The property, selectany, and uuid attributes affect COM objects. The __declspec keywords should be placed at the beginning of a simple declaration. The compiler ignores, without warning, any __declspec keywords placed after * or & and in front of the variable identifier in a declaration. A __declspec attribute specified in the beginning of a user-defined type declaration applies to the variable of that type. For example: Copy Code __declspec(dllimport) class X {} varX; In this case, the attribute applies to varX. A __declspec attribute placed after the class or struct keyword applies to the user-defined type. For example: Copy Code class __declspec(dllimport) X {}; In this case, the attribute applies to X. The general guideline for using the __declspec attribute for simple declarations is as follows: Copy Code decl-specifier-seq declarator-list; The decl-specifier-seq should contain, among other things, a base type (e.g. int, float, a typedef, or a class name), a storage class (e.g. static, extern), or the __declspec extension. The init-declarator-list should contain, among other things, the pointer part of declarations. For example: Copy Code __declspec(selectany) int * pi1 = 0; //OK, selectany & int both part of decl-specifier int __declspec(selectany) * pi2 = 0; //OK, selectany & int both part of decl-specifier int * __declspec(selectany) pi3 = 0; //ERROR, selectany is not part of a declarator The following code declares an integer thread local variable and initializes it with a value: Copy Code // Example of the __declspec keyword __declspec( thread ) int tls_i = 1;