Я тестирую расширенную функцию GNU, такую как "wcstoq" на разных платформах.
Сначала я не компилировал тестовый пример с помощью D_GNU_SOURCE ,, поэтому получил предупреждение о компиляции следующим образом:
wcstoq.c:31:12: warning: implicit declaration of function 'wcstoq'; did you mean 'wcstol'? [-Wimplicit-function-declaration]
retval=wcstoq(nptr,endptr,base);
^~~~~~
wcstol
когда я использую gdb для отладки этого тестового примера, он переходит в правильную функцию, аналогичную описанной мной ситуации _GNU_SOURCE.
Но функция работает неправильно, когда я не определил _GNU_SOURCE.
например:
Когда я проверяю регистр вне диапазона в x86_64, он должен установить retval= LLONG_MAX(0x7FFFFFFFFFFFFFFF)
, но на самом деле он установит retval= -1(0xFFFFFFFFFFFFFFFF)
.
Результат также смутил меня, когда я тестировал его на других платформах ppc, он на самом деле установил retval=0x000000007FFFFFFF
.
когда я определил _GNU_SOURCE
, функция работает нормально в x86_64 и ppc, она возвращает LLONG_MAX(0x7FFFFFFFFFFFFFFF)
.
мой вопрос:
1 Почему, когда я не определяю _GNU_SOURCE
, но gcc все еще может найти правильную функцию?
2 Почему не удалось выполнить функцию, даже gcc нашел правильную, и в некоторых случаях эта функция все еще может использоваться, но в других случаях она идет не так, как надо *
3 Почему неудавшийся результат работы fuction отличается на разных платформах, как платформы архитектуры или другие факторы влияют на разные результаты?
4 Правильный способ использования функции расширения GNU?
Thks!