Это ошибка в Clang? Следующий код:
#include <stdio.h>
int main(void)
{
int foo = 42;
int bar[1] = { foo };
printf("%d\n", bar[0]);
return 0;
}
Скомпилируется с использованием:
clang -Wall -Wextra -Werror -pedantic -pedantic-errors -std=c89 -o foo foo.c
Я не думаю, что он должен скомпилироваться, так как список инициализаторов bar[]
содержит выражение, foo
, которое не является константой времени компиляции. Действительно, если я использую gcc
вместо clang
, я получаю ожидаемые результаты:
$ gcc -Wall -Wextra -Werror -pedantic -pedantic-errors -std=c89 -o foo foo.c
foo.c: In function ‘main’:
foo.c:6: error: initializer element is not computable at load time
Этот вопрос и его принятый ответ, а также выдержки из это описание C89 предположим, что GCC прав, а Clang ошибочен:
Выражения в инициализаторе для статического объекта или для агрегата или объединения должны быть постоянными выражениями.
Моя версия clang:
$ clang -v
Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
Target: x86_64-apple-darwin11.4.2
Одна вещь, которую я заметил, это то, что последняя ревизия clang присутствует на opensource.apple.com, т.е. е. clang 425.0.24, является только 4-ю субминионными версиями старше моего clang, и у него есть модульные тесты для инициализаторов массива. Однако, если я что-то не упускаю, нет теста на инициализацию автоматических массивов с объемной областью с неконстантными выражениями (проверяются только статические массивы с объемной областью и глобальные массивы). Здесь тестовый файл, который я нашел.
Итак, что сделка?