求一段 MSDN 帮助翻译
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.
// 上面的求翻译,下面的是什么意思?
#ifdef __cplusplus
#define EXPORT extern "C " __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif
[解决办法]
// 上面的求翻译,下面的是什么意思?
#ifdef __cplusplus
#define EXPORT extern "C " __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif
这个是为了跨语言设计的一段宏。
C++程序中,
会自定义 __cplusplus 宏,
同时,C++程序在编译时候会有一个名字重整的动作,
那么 #ifdef __cplusplus
#define EXPORT extern "C " __declspec (dllexport)
的目的就是 如果是C++程序,
使用 extern "C " 强制取消这个 名字重整的过程,
即保证导出函数的名字是确定已知,不会被修改。
下面的#else 部分就是针对C的,
C中不会有这个动作,所以不需要 extern "C " ...
[解决办法]
扩展语法属性指明存储级的信息利用__declspec关键字, 其中规定,是一个特定类型是储存与Microsoft具体存储阶级属性列如下. 实例其它存储级修饰语包括静态和体外关键字. 然而,这些关键字都是这个规格的ANSI的C和C++语言, 如店不在延长语法属性. 扩展语法属性简化和规范微软具体延伸到C和C++语言.
[解决办法]
1)
关于 extern "C "
函数经过编译系统的翻译成汇编,函数名对应着汇编标号。
因为C编译函数名与得到的汇编代号基本一样,如:fun()=> _fun, main=> _main
但是C++中函数名与得到的汇编代号有比较大的差别。
如:由于函数重载,函数名一样,但汇编代号绝对不能一样。
为了区分,编译器会把函数名和参数类型合在一起作为汇编代号,
这样就解决了重载问题。具体如何把函数名和参数类型合在一起,
要看编译器的帮助说明了。
这样一来,如果C++调用C,如fun(),则调用名就不是C的翻译结果_fun,
而是带有参数信息的一个名字,因此就不能调用到fun(),为了解决
这个问题,加上extern "C "表示该函数的调用规则是C的规则,则调用
时就不使用C++规则的带有参数信息的名字,而是_fun,从而达到调用
C函数的目的。
在make方式加入lib的方法,直接看编译器的命令行参数的帮助说明。
在集成开发环境中链接一个lib的方法有两个:
1。在菜单project-> add to project-> files...中加入
对应的lib文件即可。
2。在project-> setting中link的object/library modules中加入对应lib文件
方法1较2好,因为2必须在debug,release等中分别设置。 "
2) 关于 __declspec(dllimport) 和 __declspec(dllexport)
可以使用两种方法将公共符号导入到应用程序中或从 DLL 导出函数:
生成 DLL 时使用模块定义 (.DEF) 文件。
在主应用程序的函数定义中使用 __declspec(dllimport) 或 __declspec(dllexport) 关键字。
使用 .DEF 文件
模块定义 (.DEF) 文件是包含一个或多个描述各种 DLL 属性的 Module 语句的文本文件。如果不使用 __declspec(dllimport) 或 __declspec(dllexport) 导出 DLL 函数,则 DLL 需要 .DEF 文件。
可以使用 .DEF 文件导入到应用程序中或从 DLL 导出。
使用 __declspec
32 位版的 Visual C++ 用 __declspec(dllimport) 和 __declspec(dllexport) 取代以前在 16 位版的 Visual C++ 中使用的 __export 关键字。
不使用 __declspec(dllimport) 也能正确编译代码,但使用 __declspec(dllimport) 使编译器可以生成更好的代码。编译器之所以能够生成更好的代码,是因为它十分清楚函数是否在 DLL 中,因此可以生成跳过间接级别的代码,而在跨 DLL 边界的函数中通常存在这些间接代码。但是,必须使用 __declspec(dllimport) 才能导入 DLL 中使用的变量。
如果有正确的 .DEF 文件 EXPORTS 节,则不需要 __declspec(dllexport)。添加 __declspec(dllexport) 是为了提供不使用 .DEF 文件从 .EXE 或 .DLL 导出函数的简单方法。
Win32 可移植可执行文件格式旨在最小化为修改导入而必须访问的页数。为此,它将所有程序的所有导入地址都放在一个称为“导入地址表”的位置。这使得加载程序在访问这些导入时可以只修改一两页。
[解决办法]
上面就是为了C和C++语言的兼容。
因为C和C++在编译的时候函数的命名规则是不一样的。
如果有了这个代码 extern "C " __declspec (dllexport)
在C程序中调用其中的dll函数就不会出现问题了。。
各位高手,不知道我说的对不对,请指点。。555
[解决办法]
storage-class: 存储类
extended attribute syntax: 扩充属性语法
扩展属性语法中在定义存储类信息时使用关键字__declspec,这一关键字定义了一个指定类型的实例在被存储时将同时拥有以下所列的存储类属性之一,这些属性是微软特定的(自定义的)。其它存储类修饰符包括静态及外部(static and extern)关键字。但是,这些关键字是ANSI C/C++ 标准的一部分,所以它们不被包含在扩充属性语法中。 这一语法简化并标准化了微软特定的,对c/c++语言的扩充。
====================
// 上面的求翻译,下面的是什么意思?
如果使用C++编译,则定义EXPORT值为...
否则定一其值为...
看起来扩展属性是用c写的?