【问题标题】:Googletest compile fails on defining a struct in #imported fileGoogletest 编译在#imported 文件中定义结构失败
【发布时间】:2013-07-18 17:34:45
【问题描述】:

我有两个文件,first_pass.c,其中包括描述mystring.cmystring.h。在测试first_pass.c 时,我做了以下包括

#include "../src/mystring.c"
#include "../src/first_pass.c"
#include <gtest/gtest.h>

一切都很好,直到我不得不在mystring.h 中定义一个结构。就这么简单

typedef struct Split {
    char *head;
    char *tail;
}Split;

然后我在error: ‘Split’ has a previous declaration as ‘typedef struct Split Split’上编译时开始失败

课程要求使用 C(不是 C++)和 MAKE,因此不推荐使用其他测试框架,例如 Check。我知道它定义了两次结构,第一次加载mystring.c,另一次加载first_pass.c。我该怎么办?

【问题讨论】:

  • 为什么要定义同一个结构两次?
  • #包含源文件(.c)自找麻烦
  • 正如我在下面回答的那样,我别无选择。 googletest 文件是带有 TEST 宏的简单标头,因此要定义我的测试代码,我必须将其全部包含在内。这是我的参考:meekrosoft.wordpress.com/2009/11/09/…

标签: c include c-preprocessor googletest


【解决方案1】:

使用标头保护来防止多次包含标头。

http://en.wikipedia.org/wiki/Include_guard

一个建议将头文件添加到 C 文件而不是将 C 文件添加到另一个 C 文件。

【讨论】:

  • 你是对的!我读过它,但不认为是这种情况。谢谢!我会给你支票,因为你是第一个。
【解决方案2】:

最佳方式:不包含“.c”文件,然后编译以将“.o”分开并将它们链接在一起。

如果无法避免像mystring.h 这样的标题,请寻找标题保护,例如here in SO

【讨论】:

    【解决方案3】:

    你需要保护你的结构定义如下

    #ifndef SOME_GUARD_NAME
    #define SOME_GUARD_NAME
    
    typedef struct Split {
        char *head;
        char *tail;
    }Split;
    
    #endif
    

    由于您包含“.c”文件,因此请查看here 以避免所有这些混乱。

    【讨论】:

    • 我别无选择。 googletest 文件是带有 TEST 宏的简单标头,因此要对我的测试代码进行定义,我必须将其全部包含在内。但感谢您提供良好的教育链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多