C++函数或类之前的宏是什么?

What's a macro before a function or a class in C++?

本文关键字:是什么 函数 C++      更新时间:2023-10-16

我见过一些类似的代码:

#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();

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

呃。。。我的意思是我不懂语法。

它是一个预处理器宏定义。第一个定义宏的名称为A,第二个定义宏名为B。一旦定义了标识符AB,预处理器就会用空字符串替换它们。预处理器也可以使用#ifdef测试宏是否已定义并有条件地生成代码。

在那里使用宏有什么意义?

宏的名称没有帮助,因此无法判断。

关于__declspec(dllexport),请参阅我对另一个问题的回答。它是msvc编译器中使用的动态链接的实现定义说明符。__attribute__是GNU编译器中实现定义行为的说明符。宏用于根据目标编译器选择正确的说明符。