什么是GTEST_API_ int main中的GTEST_API_(int argc,char ** argv){}?

时间:2016-11-11 22:00:31

标签: c++ googletest

要使用Google Test框架,应该(?)使用主要功能:

GTEST_API_ int main(int argc, char **argv) {
  testing::InitGoogleTest(&argc, argv);
  [...]
  return RUN_ALL_TESTS();
}

什么是GTEST_API_

在文件gtest-port.h中,我可以看到如下内容:

# if GTEST_LINKED_AS_SHARED_LIBRARY
#  define GTEST_API_ __declspec(dllimport)
# elif GTEST_CREATE_SHARED_LIBRARY
#  define GTEST_API_ __declspec(dllexport)
# endif
#elif __GNUC__ >= 4 || defined(__clang__)
# define GTEST_API_ __attribute__((visibility ("default")))
#endif // _MSC_VER

#ifndef GTEST_API_
# define GTEST_API_
#endif

以下是__declspec的一些说明: https://msdn.microsoft.com/en-us/library/dabb5z75.aspx

  

__ declspec Visual Studio 2015其他版本Microsoft特定

     

用于指定存储类信息的扩展属性语法   使用__declspec关键字,它指定一个实例   给定类型将与Microsoft特定的存储类一起存储   属性如下所列。其他存储类修饰符的示例   包括静态和外部关键字。但是,这些关键字是   C和C ++语言的ANSI规范的一部分,同样如此   不属于扩展属性语法。扩展属性   语法简化并标准化特定于Microsoft的扩展   C和C ++语言。

我不明白。

这里我有C ++函数的描述:

http://www.cplusplus.com/doc/tutorial/functions/

  

类型名称(parameter1,parameter2,...){statements}

     

其中:    - type是函数返回的值的类型。 [...]

GTEST_API_也改变了返回的int的内容吗?

1 个答案:

答案 0 :(得分:0)

完整的源代码是:

#ifdef _MSC_VER
# if GTEST_LINKED_AS_SHARED_LIBRARY
#  define GTEST_API_ __declspec(dllimport)
# elif GTEST_CREATE_SHARED_LIBRARY
#  define GTEST_API_ __declspec(dllexport)
# endif
#elif __GNUC__ >= 4 || defined(__clang__)
# define GTEST_API_ __attribute__((visibility ("default")))
#endif // _MSC_VER

#ifndef GTEST_API_
# define GTEST_API_
#endif

当您构建共享库(Windows中的DLL或Linux中的共享对象)时,默认情况下,Microsoft Visual C ++不会导出任何内容,我们需要使用IAT来查找正确的函数。另外,gcc(来自版本4)和clang将:

  

使用-fvisibility=hidden,您告诉GCC每个未明确标记为visibility属性的声明都具有隐藏的可见性。

这是一个优化,提示编译器动态共享对象将直接导出函数指针而不仅仅是动态共享的IAT(导入地址表)/ GOT(全局偏移表)中的条目宾语。它允许它生成更好的代码,保存来自IAT / GOT的函数指针加载和间接跳转。

你可以自己尝试,在Windows中制作一个dll,构建它,VC ++不会为你创建.lib文件,依赖者walker会显示没有导出的函数。我不确定,但我听说您可以通过模块定义(.DEF)文件使用它,通常将.def文件与COM一起使用。

因此,您需要为导出的函数指定GTEST_API_以启用其可见性

进一步阅读: