2014-05-14 37 views
0

我已經使用googletest爲我的Android NDK項目包含.c文件。我使用類型.cpp的測試類來做同樣的事情。我想改爲使用.c文件。當我嘗試使用它時出現以下錯誤:如何使用.c文件在Google測試中編寫測試類而不是.cpp文件?

Running main() from gtest_main.cc 
[==========] Running 0 tests from 0 test cases. 
[==========] 0 tests from 0 test cases ran. (1 ms total) 
[ PASSED ] 0 tests. 

我該如何解決這個問題?

+0

我不明白。你爲什麼在乎你的文件是否有.c或.cpp文件擴展名?爲什麼不使用工程*和*準確描述文件內容? –

+0

我得到某些編譯問題,無法識別類型轉換 錯誤:無法將'MyVersion {aka tagMYVersion}'轉換爲'MyStatus'參數'2' 當我單獨運行ndk-build時沒有這樣的編譯問題該項目/當我編譯我的源代碼在.c文件而不是.cpp,所以想要一種方式來使用.c文件運行gtest – user3054298

+0

因此它只適用於我的c代碼的一些部分! – user3054298

回答

6

您不能使用.c文件在googletest而不是.cpp文件中編寫測試類。

.c文件應包含的C語言源代碼和C/C++編譯器將假定一個.c文件 要被編譯爲C.

.cpp文件應包含C++語言的源代碼和C/C++編譯器將假定.cpp文件 將被編譯爲C++。

C和C++是相關但不同的編程語言。 C比C++更老更簡單。 C語言中沒有任何類。包含類的C++源代碼不能編譯爲C.

Googletest是一個用C++編寫的單元測試框架,而不是C,它需要你用C++編寫 你的測試代碼,使用框架類。您的測試必須編碼爲.cpp(和.h)文件,以便 編譯器將它們編譯爲C++。

但是,你可以使用googletest來單元測試C代碼。 C代碼將在.c.h文件中,但是您的 必須像往常一樣在.cpp.h文件中編碼您的單元測試。 C/C++編譯器知道 .c文件將被編譯爲C,而.cpp文件將被編譯爲C++。

有一個小麻煩,你必須面對,當你想#include "some_header.h" 在C++單元測試代碼,並some_header.h是C語言頭文件之一:

C++編譯器是要處理some_header.h,並且它可以過程它正確只要 因爲它知道some_header.h是一個C語言的頭文件。爲了通知C++編譯器some_header.h 是C頭,你這樣寫:

extern "C" { 
#include "some_header.h" 
} 

如果你不把extern "C" { ... }#include的C語言頭左右,那麼你將得到未定義的符號 錯誤的鏈接時間。

我建議你嘗試用包含以下三個文件的項目:

return_one。^ h

// return_one.h 
#ifndef RETURN_ONE_H 
#define RETURN_ONE_H 

// A C library :) 

// A C function that always return 1. 
extern int return_one(void); 

#endif 

return_one.c

// return_one.c 
#include "return_one.h" 

int return_one(void) 
{ 
    return 1; 
} 

test_return_one.cpp

// test_return_one.cpp 
#include "gtest/gtest.h" 
extern "C" { 
#include "return_one.h" 
} 

TEST(t_return_one, returns_1) 
{ 
    EXPECT_EQ(1,return_one()); 
} 

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

獲得這個項目進行編譯,鏈接,並與googletest運行。

你可能會發現this question有幫助的答案。

+0

當我嘗試只包含我的頭文件而不包含要測試的.c文件時,錯誤:未定義引用'__FreeRetransmitterQueue' collect2:ld返回1退出狀態 make.exe:*** [obj/local/armeabi/SmartTest]錯誤1 – user3054298

+0

當我包含我的.c文件時,出現某些編譯問題,無法識別類型轉換 錯誤:無法將參數'2'的'MyVersion {aka tagMYVersion}'轉換爲'MyStatus' – user3054298

+0

當我包含我的.c文件時,出現無法識別類型轉換的某些編譯問題 錯誤:無法將參數'2'的'MyVersion {aka tagMYVersion}'轉換爲'MyStatus' 沒有這樣的編譯問題當我單獨爲項目運行ndk-build /當我在.c文件中編譯我的源代碼時而不是.cpp – user3054298

相關問題