簡體   English   中英

如何在C中有條件地編譯main()?

[英]How to conditional compile main() in C?

我正在使用C中的一個小型開源項目,我正在嘗試使用帶有C的測試框架(框架是min_unit )。

我有一個帶有原型的foo.h文件和帶有實現的foo.c文件。

在我的測試文件中, tests.c ,我有

#include "../test_framework/min_unit.h"
#include "foo.c"

... test cases ...

問題是,因為我在foo.c有一個main()函數(我需要編譯它),我無法編譯tests.c因為我得到一個錯誤,指出

note: previous definition of ‘main’ was here
int main() {

我的問題是,有沒有辦法使它成為foo.c中的main()函數是有條件的,所以當我運行tests.c時它不會編譯? 只需要一遍又一遍地刪除和添加main就太煩人了。

使用條件編譯的最簡單方法是使用#ifdef語句。 例如,在foo.c你有:

#ifdef NOT_TESTING //if a macro NOT_TESTING was defined
int main() {
    //main function here
}
#endif

test.c ,你把:

#ifndef NOT_TESTING //if NOT_TESTING was NOT defined
int main() {
    //main function here
}
#endif

如果要在foo.c編譯main函數,只需在編譯命令中添加選項-DNOT_TESTING即可。 如果要在test.c編譯main函數,請不要添加該選項。

你有沒有嘗試使用預處理器編譯條件? 可能你已經嘗試但它不起作用,哼?

無論如何,你可能應該:

1-在“tests.c”類文件的頂部定義一個標記,如:

#defined foo_MIN_UNIT_TEST

2-使用#ifndef / #endif在“foo.c”類文件中包圍你的“main(){...}”方法,如:

#ifndef foo_MIN_UNIT_TEST  //consider using #ifndef not #ifdef!!!
int main() 
{ ... }
#endif

3-這樣,當您編譯單元測試文件時,foo.c的main()方法將不會包含在編譯時,並且編譯器將只能使用唯一的main()測試方法。

如需進一步閱讀: http//www.cprogramming.com/

問候。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM