2011-03-17 35 views
2

當我嘗試使用check unit testing framework-std=c99標誌編譯測試時,我遇到了一個奇怪的語法錯誤。使用C99檢查單元測試框架時的語法錯誤

所以,我試圖編譯example.c

#include <check.h> 
START_TEST(example) { 
    fail(); 
} END_TEST 
int main(int argc, char** argv){ return 0; } 

使用自動工具,與Makefile.am

check_PROGRAMS = example 
example_SOURCES = example.c 
example_CFLAGS = @[email protected] -Wall -pedantic -std=c99 
example_LDADD = @[email protected] 

configure.ac

AC_PREREQ([2.61]) 
AC_INIT([example], [1.0.0], [[email protected]]) 
AM_INIT_AUTOMAKE([foreign -Wall -Werror]) 
AC_CONFIG_SRCDIR([example.c]) 

AC_PROG_CC 
AM_PROG_CC_C_O 
AC_PROG_RANLIB 

PKG_CHECK_MODULES([CHECK], [check >= 0.9.5]) 

AC_HEADER_STDC 
AC_CHECK_HEADERS([stdlib.h string.h unistd.h]) 

AC_C_CONST 
AC_TYPE_MODE_T 
AC_TYPE_OFF_T 
AC_TYPE_SIZE_T 
AC_TYPE_UINT32_T 

AC_FUNC_FORK 
AC_FUNC_MALLOC 
AC_FUNC_REALLOC 
AC_FUNC_STAT 
AC_CHECK_FUNCS([memset]) 

AC_CONFIG_FILES([Makefile]) 
AC_OUTPUT 

不過,我得到這個怪異錯誤:

% make check 
make example 
gcc -DPACKAGE_NAME=\"example\" -DPACKAGE_TARNAME=\"example\" -DPACKAGE_VERSION=\"1.0.0\" -DPACKAGE_STRING=\"example\ 1.0.0\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE=\"example\" -DVERSION=\"1.0.0\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FORK=1 -DHAVE_VFORK=1 -DHAVE_WORKING_VFORK=1 -DHAVE_WORKING_FORK=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_STDLIB_H=1 -DHAVE_REALLOC=1 -DHAVE_MEMSET=1 -I. -I/opt/local/include -std=c99 -g -O2 -MT example-example.o -MD -MP -MF .deps/example-example.Tpo -c -o example-example.o `test -f 'example.c' || echo './'`example.c 
example.c: In function 'example': 
example.c:3: error: parse error before ',' token 
make[1]: *** [example-example.o] Error 1 
make: *** [check-am] Error 2 

因此,它找到fail()(我認爲檢查實現爲宏)的語法錯誤。如果我刪除-std=c99標誌,語法錯誤消失,並且它工作正常。

有沒有辦法解決這個問題?我絕對想要-std=c99,以便我的編譯器可以使用可變宏的使用(和check.h)。

+0

是否有什麼特別的理由在'example_CFLAGS = @ CHECK_CFLAGS @ ...'之類使用'@@'替換?我總是發現在這種情況下'$(CHECK_CFLAGS)'更容易使用,因爲調用'make'的用戶可以輕鬆地覆蓋'CHECK_CFLAGS'來調試構建失敗和類似事情。 – ndim 2011-04-14 23:09:32

回答

3

該網站上的 basic tutorial總是顯示 START_TESTEND_TEST宏之間調用的 fail宏。他們很可能爲這些宏設置了一些東西。 完成。

現在您只需要編譯即可獲得fail()的參數。

它的定義是這樣的:

#define fail(...) _fail_unless(0, __FILE__, __LINE__, "Failed" , ## __VA_ARGS__, NULL) 

如果沒有給出參數裏面會有一個流浪,

+0

不,不會改變任何東西。 – rampion 2011-03-17 18:45:18

+0

您的代碼與示例不符。 'START_TEST(某事){...} END_TEST'。你錯過了大括號。 – Mat 2011-03-17 18:48:07

+0

大括號也不重要。同樣的錯誤。 – rampion 2011-03-17 18:49:16

相關問題