LINUX.ORG.RU

[C] ifdef strcpy

 


0

0

Подскажите пожалуйста, почему нижеприведенная программа не определяет, что функция strcpy определена? И можно ли проверить наличие функции на чистом C (в частности без HAVE_STRCPY полученного от configure скрипта)?

Мне нужно определить наличие strlcpy/strlcat, поэтому если кто то знает кроссплатформенный макрос для них (а-ля _XOPEN_SOURCE), то буду рад узнать про него.

#include <stdio.h>
#include <string.h>


int main() {

#ifdef strcpy
printf («\nDEFINED\n»);
#else
printf («\nNOT DEFINED\n»);
#endif

}

★★★★★

Подскажите пожалуйста, почему нижеприведенная программа не определяет, что функция strcpy определена?

Видимо потому что препроцессор ничего не знает про C и функции.

Deleted
()

никак, если нужен действительно кроссплатформенный способ, то кури доки по cmake

Reset ★★★★★
()
#include <dlfcn.h>
#include <stdio.h>
#include <string.h>

int main()
{
  if (dlsym (NULL, "strcpy"))
    puts ("\nDEFINED");
  else
    puts ("\nNOT DEFINED");
  return 0;
}
kmeaw ★★★
()

Я не претендую на 100%-ную точность, но определить доступность какой-либо функции API можно примерно таким способом:
конфигурационный скрипт подсовывает компилятору простенькую программу, в которой происходит вызов проверяемой на наличие функции. Если сборка завершится с успехом, то объявляется соответствующий символ препроцессора (STRCPY_DEFINED или HAVE_STRCPY или на что хватит фантазии).

m0rph ★★★★★
()
Ответ на: комментарий от m0rph

автор специально для тебя написал «в частности без HAVE_STRCPY полученного от configure скрипта» ;)

alex_custov ★★★★★
()

> И можно ли проверить наличие функции на чистом C (в частности без HAVE_STRCPY полученного от configure скрипта)?

Нет.

const86 ★★★★★
()

>Мне нужно определить наличие strlcpy/strlcat

Это ненужно по определению - это нестандартное bsd говно

кто то знает кроссплатформенный макрос


Самый кросплатфоменный макрос для такого новна - реализовать эти ненужные ф-ции в своеей программе, но это опять же ненужно исходя из п.1

zepto
()
Ответ на: комментарий от bibi

Собирать статически с такой библиотекой, в которой есть нужная функция.

kmeaw ★★★
()

Если на *BSD можно было проверять, что это __BSD__, то с Solaris так кажется не получится. Наверное и правда буду делать HAVE_STRLCPY.

saper ★★★★★
() автор топика
Ответ на: комментарий от saper

Хотя возможно удастся определять ОС в каждом отдельном случае через #ifdef. Поищу документацию.

saper ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.