#ifdef __cplusplus
extern "C"
{
#endif
PROJ_EXPORT void log_verbosity(int level);
#ifdef __cplusplus
}
#endif
------------------------------------------------------------------------------------------------
我的问题是:
1. 上半部分的#ifdef WIN32应该是定义在Windows下面编译的,那么这个WIN32宏是由谁定义的?
2. 如果在Windows平台下面编译,则PROJ_EXPORT宏会被替换为__declspec(dllexport),这个应该是用于DLL导出函数的;如果在Linux平台下面编译,那么会运行“#else
#define PROJ_EXPORT #endif”部分,这样的话,函数原型声明“PROJ_EXPORT void
log_verbosity(int level);”中的PROJ_EXPORT会被替换成什么?这个宏没有值呀。
3. 为什么一些C库的头文件有如上extern "C"的部分,而一些C库又没有?按照我的理解,这个extern
"C"的部分,不是应该在所有的C库的头文件里面都加上吗?
4. 为什么一些C库的头文件有如上PROJ_EXPROT的部分,而另外一些则没有?没有的库,如果在Windows下面编译,如果编译为DLL,又没有__declspec(dllexport),是不是就没有导出函数了?
5. PROJ_STATIC是由谁定义的?
谢谢!
--
Yili Zhao
2011/12/15 Yili Zhao <pan...@gmail.com>:
--
Milo Yip
http://www.cnblogs.com/miloyip/
http://weibo.com/miloyip/
http://twitter.com/miloyip/
http://msdn.microsoft.com/en-us/library/b0084kay(v=VS.100).aspx
2011/12/15 Milo Yip <mil...@gmail.com>:
On Dec 17, 12:16 am, Jeff Chen <sheismyl...@gmail.com> wrote:
> 搭车问一下,很多项目里会这样:
> #define DECLARE_DATA extern
>
> 然后extern的时候用DECLARE_DATA
>
> 这样做有什么好处么?
>
> >> 如果在Windows平台下面编译,则PROJ_EXPORT宏会被替换为__declspec(dllexport),这个应该是用于DLL导出函数的;如果 在Linux平台下面编译,那么会运行"#else
> >> #define PROJ_EXPORT #endif"部分,这样的话,函数原型声明"PROJ_EXPORT void
> >> log_verbosity(int level);"中的PROJ_EXPORT会被替换成什么?这个宏没有值呀。
> >> 3. 为什么一些C库的头文件有如上extern "C"的部分,而一些C库又没有?按照我的理解,这个extern
> >> "C"的部分,不是应该在所有的C库的头文件里面都加上吗?
> >> 4.
> >> 为什么一些C库的头文件有如上PROJ_EXPROT的部分,而另外一些则没有?没有的库,如果在Windows下面编译,如果编译为DLL,又没有__dec lspec(dllexport),是不是就没有导出函数了?
#define DECLARE_DATA
很方便地取消这些符号的extern属性,而不用到处修改代码
Try using some more exotic systems where things aren't as simple as that.Various less mainstream systems have very different ways of inter-modulelinkage and compilation.