C++函数或类之前的宏是什么?
What's a macro before a function or a class in C++?
我见过一些类似的代码:
#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
。一旦定义了标识符A
和B
,预处理器就会用空字符串替换它们。预处理器也可以使用#ifdef
测试宏是否已定义并有条件地生成代码。
在那里使用宏有什么意义?
宏的名称没有帮助,因此无法判断。
关于__declspec(dllexport)
,请参阅我对另一个问题的回答。它是msvc编译器中使用的动态链接的实现定义说明符。__attribute__
是GNU编译器中实现定义行为的说明符。宏用于根据目标编译器选择正确的说明符。
相关文章:
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 是什么让放置新调用对象的构造函数?
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 在函数中拥有函数原型的目的是什么?
- 使用基类指针调用基类的值构造函数的语法是什么?
- C++:使用方法调用析构函数的顺序是什么?
- 将此布尔值传递给此函数的最有效方法是什么?
- * 和 ** 在 C++ 函数声明中是什么意思?
- C++:Lambda 函数指针转换的用例是什么?
- C++关于指针和使用函数将它们启动到堆的行为究竟是什么?
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 在将函数声明为友元时,尖括号的含义是什么?
- 在模板类之外定义友元函数的正确方法是什么?
- 在使用包含冒号的类似函数的宏时,是什么导致了这种编译器差异?
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 这里的字符串函数是什么意思
- 传递 lambda 函数的权衡是什么?
- 在C 中,对2D数组的增量是什么?函数断言(0)做什么?