类声明时,类名前面加宏名是什么意思?

每天进步一点点 2011-10-17 02:31:55
在qwebframe.h中看到类QWebFrame的声明
class QWEBKIT_EXPORT QWebFrame : public QObject
{
}
没有见过类名前加宏的用法,请问大家这是表示什么意思,有什么作用呢?

在qwebkitglobal.h中有QWEBKIT_EXPORT宏的定义:
#if !defined(QWEBKIT_EXPORT)
#  if defined(QT_SHARED)
#    define QWEBKIT_EXPORT Q_DECL_EXPORT
#  else
#    define QWEBKIT_EXPORT
#  endif
#endif
...全文
1804 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-10-17
  • 打赏
  • 举报
回复
编译选项加/EP /P,重新编译,查看宏展开后对应的.i文件。
BT六眼飞鱼 2011-10-17
  • 打赏
  • 举报
回复
LZ可以看看WIKI中对于GCC定义函数导入导出宏的解释:
http://gcc.gnu.org/wiki/Visibility
BT六眼飞鱼 2011-10-17
  • 打赏
  • 举报
回复
微软的编译器关于函数导入导出的定义如下:
__declspec(dllexport) 声明一个导出函数,一般用于dll中
__declspec(dllimport) 声明一个导入函数,一般用于使用某个dll的exe中
更详细的可以看msdn

GCC关于函数导入导出的定义如下:


#if defined _WIN32 || defined __CYGWIN__
#ifdef BUILDING_DLL
#ifdef __GNUC__
#define DLL_PUBLIC __attribute__ ((dllexport))
#else
#define DLL_PUBLIC __declspec(dllexport) // Note: actually gcc seems to also supports this syntax.
#endif
#else
#ifdef __GNUC__
#define DLL_PUBLIC __attribute__ ((dllimport))
#else
#define DLL_PUBLIC __declspec(dllimport) // Note: actually gcc seems to also supports this syntax.
#endif
#endif
#define DLL_LOCAL
#else
#if __GNUC__ >= 4
#define DLL_PUBLIC __attribute__ ((visibility ("default")))
#define DLL_LOCAL __attribute__ ((visibility ("hidden")))
#else
#define DLL_PUBLIC
#define DLL_LOCAL
#endif
#endif
  • 打赏
  • 举报
回复
谢谢指导。听你说来,__declspec(dllexport)和__attribute__((visibility("default")))是分别表示在windows下和linux下的使用了?
我现在是用QWebFrame有些问题,在查看它的源码,看到它的类声明处的这个东东,不知道跟我现在出现的问题有没有关系
你能大概帮忙解释一下,在类声明时类名前加上__declspec(dllexport)或__attribute__((visibility("default")))的意义吗?是表示允许动态库符号导出吗?
急于解决现在使用QWebFrame的一个问题,所以来不及找一些动态库的资料来具体研究这个用法了,还请大概解释一下,非常感谢!

[Quote=引用 5 楼 luciferisnotsatan 的回复:]

__declspec(dllexport) 这个是windows vs里的
__attribute__((visibility("default"))) 这个是linux gcc里的

用于动态库的符号导出。如果你对动态库不了解,还是去找点相关资料看下吧。
[/Quote]
chos2006 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 chemmyhuang 的回复:]
在qwebframe.h中看到类QWebFrame的声明
class QWEBKIT_EXPORT QWebFrame : public QObject
{
}
没有见过类名前加宏的用法,请问大家这是表示什么意思,有什么作用呢?

在qwebkitglobal.h中有QWEBKIT_EXPORT宏的定义:
#if !defined(QWEBKIT_EXPORT)
# if def……
[/Quote]

+++++
luciferisnotsatan 2011-10-17
  • 打赏
  • 举报
回复
__declspec(dllexport) 这个是windows vs里的
__attribute__((visibility("default"))) 这个是linux gcc里的

用于动态库的符号导出。如果你对动态库不了解,还是去找点相关资料看下吧。
  • 打赏
  • 举报
回复
在qglobal.h中有
#ifndef Q_DECL_EXPORT
# ifdef Q_OS_WIN
# define Q_DECL_EXPORT __declspec(dllexport)
# elif defined(QT_VISIBILITY_AVAILABLE)
# define Q_DECL_EXPORT __attribute__((visibility("default")))
# endif
# ifndef Q_DECL_EXPORT
# define Q_DECL_EXPORT
# endif
#endif

不懂__declspec(dllexport)和__attribute__((visibility("default")))是做什么用的。。
另外,不考虑宏的内容,在类声明时的类名前面加个宏是什么用法呢?才疏学浅,第一次遇到。。

[Quote=引用 2 楼 luciferisnotsatan 的回复:]

define QWEBKIT_EXPORT Q_DECL_EXPORT
去看看Q_DECL_EXPORT这个又是什么
[/Quote]
柯本 2011-10-17
  • 打赏
  • 举报
回复
与别的宏没区别
#if !defined(QWEBKIT_EXPORT) //如果没定义QWEBKIT_EXPORT
# if defined(QT_SHARED) //如果定义了QT_SHARED
# define Q_DECL_EXPORT Q_DECL_EXPORT //将Q_DECL_EXPORT 定义成 Q_DECL_EXPORT
# else
# define QWEBKIT_EXPORT //将QWEBKIT_EXPORT 定义为空
# endif
#endif
而Q_DECL_EXPORT 也是一个宏,它结果有几个,如__declspec(dllexport)
__attribute__((visibility("default"))) 等
而最终类可能是
class QWebFrame : public QObject
{
}

class __declspec(dllexport) QWebFrame : public QObject
{
}

luciferisnotsatan 2011-10-17
  • 打赏
  • 举报
回复
define QWEBKIT_EXPORT Q_DECL_EXPORT
去看看Q_DECL_EXPORT这个又是什么
luciferisnotsatan 2011-10-17
  • 打赏
  • 举报
回复
class __declspec(dllimport) X {};

dll导入导出类就有用这个

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧