Преобразование комментария в ответ.
Быстрое исправление
Добавление #include <stdio.h>
перед #include <stdlib.h>
- или почти любым другим стандартомзаголовок. Эта ошибка появляется, только если <stdlib.h>
является первым системным заголовком. Я не понял, почему.
В вашей программе поменяйте местами строки #include <math.h>
и #include <stdlib.h>
;затем он скомпилируется (при условии, что вы включите что-то, что определяет IDX
).
Фон
Я отметил это в комментариях к вопросам и ответам о Не могу скомпилировать программу на CMac после обновления до Catalina 10.15 - в частности, комментарии 1 и 2 . При форматировании они говорят:
Одна странность - у меня есть какой-то код, который начал #include <stdlib.h>
, а затем не смог скомпилировать жалобу на:
In file included from …/usr/include/sys/wait.h:110,
from …/usr/include/stdlib.h:66,
from bm.c:27:
…/usr/include/sys/resource.h:443:9: error: no previous prototype for ‘getiopolicy_np’ [-Werror=missing-prototypes]
443 | int getiopolicy_np(int, int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
Тем не менее, когда я добавляю #include <ctype.h>
до #include <stdlib.h>
компилируется нормально. Я все еще работаю над тем, что это значит и как с этим справиться автоматически. Элементами …
являются пути:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/
Используя принятый ответ на этот вопрос, была задана переменная среды CPATH
:
export CPATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
Другой (близкий к минимальному)Вариант на этом:
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
printf("Hello World!\n");
return EXIT_SUCCESS;
}
С заголовками в последовательности <stdlib.h>
затем <stdio.h>
код не компилируется;с заголовками в обратной последовательности код компилируется без зазубрин. Что-то странное в <stdlib.h>
. Порядок стандартных заголовков, подобных этому, должен не влиять на компиляцию, но влияет. В этом есть что-то очень странное, потому что нативные компиляторы XCode (/usr/bin/gcc
или /usr/bin/clang
)не сталкивайтесь с той же проблемой.
Применение к коду в вопросе
Применение этого к коду в вопросе, размещение #include <math.h>
перед #include <stdlib.h>
позволяет избежать ошибоксообщается в вопросе. Однако этот код не компилируется, потому что IDX
не определен или не объявлен (и не существует предшествующих прототипов для двух функций, но не все используют параметры компилятора для обеспечения того, чтобы нестатические функции объявлялись перед их использованием или определением). ).
#include <math.h>
#include <stdlib.h>
// ...and a definition of IDX
// ...and maybe declarations of distance() and computeDistances()
double distance(double *a, double *b, int d)
{
double dist = 0;
for (int i = 0; i < d; i++)
dist += pow(a[i] - b[i], 2);
return sqrt(dist);
}
double *computeDistances(double *X, int n, int d)
{
double *dist = malloc((n-1) * sizeof(*dist));
double *vp = X + (n-1) * d;
for (int i = 0; i < n-1; i++)
dist[i] = distance(&(X[IDX(d, i, 0)]), vp, d);
return dist;
}
Предостережения
Однако, как я уже отмечал выше, я не до конца установил, в чем причина проблемы, только в том, что проблема возникает именно так, как описано в вопросе. (имена файлов и номера строк и все), и что есть простой, но не очевидный обходной путь. Я обнаружил проблему при компиляции директории библиотеки, содержащей около 200 исходных файлов и чуть более 100 заголовков;большинство из них работало нормально, но 6 или около того, которые не компилировались, имели <stdlib.h>
в качестве первого включенного заголовка.
Параметры компилятора:
gcc -O3 -g -std=c11 -pedantic -Wall -Wextra -Werror -Wshadow -Wmissing-prototypes \
-Wpointer-arith -Wwrite-strings -Wold-style-definition -Wcast-qual -Wstrict-prototypes \
-o trial-1 trial-1.c
GCC - самодельный9.2.0 скомпилировано на macOS 10.14 Mojave.