Синтаксическая ошибка при использовании среды проверки модульного тестирования с C99

Я получаю странную синтаксическую ошибку, когда пытаюсь скомпилировать тесты с помощью проверочной среды модульного тестирования с -std=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 = @CHECK_CFLAGS@ -Wall -pedantic -std=c99
example_LDADD = @CHECK_LIBS@

и 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) вариативных макросов было одобрено компилятором.


person rampion    schedule 17.03.2011    source источник
comment
Есть ли какая-то особая причина использовать замену @@ в подобных example_CFLAGS = @CHECK_CFLAGS@ ...? Я всегда нахожу, что $(CHECK_CFLAGS) намного проще использовать в таких случаях, поскольку пользователь, вызывающий make, может легко переопределить CHECK_CFLAGS для отладки сбоев сборки и подобных вещей.   -  person ndim    schedule 15.04.2011


Ответы (1)


В базовом руководстве на этом сайте всегда отображается fail, вызываемый между START_TEST и END_TEST макросы. Скорее всего, они что-то настроили для этих макросов. Готово.

Теперь все, что вам нужно для компиляции, это дать fail() аргумент.

Он определяется следующим образом:

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

У которого будет случайный ,, если аргумент не указан.

person Mat    schedule 17.03.2011
comment
Нет, это ничего не меняет. - person rampion; 17.03.2011
comment
Ваш код не соответствует примерам. START_TEST(something) { ... } END_TEST. Вам не хватает брекетов. - person Mat; 17.03.2011
comment