This question already has answers here:
Macros in the middle of a class or function declaration

(4个答案)


4年前关闭。




我看过一些这样的代码:
#define A // macro
A void foo(bar); // function declaration

还有这个:
#define B // macro
class B foo { // class declaration
  bar
};

在那使用宏是什么意思?

嗯...我的意思是我不懂语法。我以前没看过

实际上,我只是在opencv3.1的features2d.hpp中找到这种代码。
class CV_EXPORTS_W BOWImgDescriptorExtractor {
...
CV_WRAP void setVocabulary( const Mat& vocabulary );
...
}

在cvdef.h中
#if (defined WIN32 || defined _WIN32 || defined WINCE || defined __CYGWIN__) && defined CVAPI_EXPORTS
#  define CV_EXPORTS __declspec(dllexport)
#elif defined __GNUC__ && __GNUC__ >= 4
#  define CV_EXPORTS __attribute__ ((visibility ("default")))
#else
#  define CV_EXPORTS
#endif

/* special informative macros for wrapper generators */
#define CV_EXPORTS_W CV_EXPORTS
#define CV_WRAP

在这里,CV_EXPORTS_W和CV_WRAP是宏。我还没有在C++中看到这种语法。

最佳答案

通常,这些东西是该语言的编译器或系统特定扩展的占位符。

例如,如果使用Windows DLL构建程序,则要导入符号,可以声明该函数

__declspec(dllimport) void foo();

问题在于,如果将代码移植到另一个系统或使用不支持这种非标准功能的编译器构建,则__declspec(dllimport)通常将不起作用。

因此,声明可能是
#ifdef _WIN32    /*  or some macros specific to a compiler targeting windows */

#define IMPORT __declspec(dllimport)
#else
#define IMPORT
#endif

IMPORT void foo();

在很多情况下,使用特定的编译器,目标(例如,从库中导入符号的程序或正在构建的用于导出符号的库)以及可能使用这种技术的主机系统。

07-24 13:56