strnlen Funktion nicht gefunden
Hallo Liste!
Ich habe möchte die Funktion "strnlen" aus dem Headerfile "string.h"
benutzen und laut man-Page habe ich alles richtig gemacht. Also bsp.
#include
Sven Schiwek schrieb:
Hallo Liste! Ich habe möchte die Funktion "strnlen" aus dem Headerfile "string.h" benutzen und laut man-Page habe ich alles richtig gemacht. Also bsp.
Mein Compiler (gpp) bricht beim Compilieren jedoch mit 'strnlen' undeclared first use this function ... ab. Ich habe sogar schon im header-file selbst nachgeschaut und die Funktion wird dort deklariert! Weiß jemand woran das liegen könnte?
Danke, Sven. da gibt's __HAVE_ARCH_STRNLEN wenn definiert, dann gibt's strnlen nicht benutze strlen(char *) gruss Hans
On Don, 2001-09-06 at 10:45, Sven Schiwek wrote:
Hallo Liste! Ich habe möchte die Funktion "strnlen" aus dem Headerfile "string.h" benutzen und laut man-Page habe ich alles richtig gemacht. Also bsp.
#include
int main(){ cout << strnlen("SuSE-Hilfe", 5); return } Mein Compiler (gpp) bricht beim Compilieren jedoch mit 'strnlen' undeclared first use this function ... ab.
aus man strnlen: CONFORMING TO This function is a GNU extension. Aus /usr/include/string.h: #ifdef __USE_GNU [..] extern size_t strnlen (__const char *__string, size_t __maxlen) __THROW __attribute_pure__; #endif Aus /usr/include/features.h /* These are defined by the user (or the compiler) to specify the desired environment: __STRICT_ANSI__ ISO Standard C. _ISOC99_SOURCE Extensions to ISO C89 from ISO C99. _POSIX_SOURCE IEEE Std 1003.1. _POSIX_C_SOURCE If ==1, like _POSIX_SOURCE; if >=2 add IEEE Std 1003.2; if >=199309L, add IEEE Std 1003.1b-1993; if >=199506L, add IEEE Std 1003.1c-1995 _XOPEN_SOURCE Includes POSIX and XPG things. Set to 500 if Single Unix conformance is wanted, to 600 for the upcoming sixth revision. _XOPEN_SOURCE_EXTENDED XPG things and X/Open Unix extensions. _LARGEFILE_SOURCE Some more functions for correct standard I/O. _LARGEFILE64_SOURCE Additional functionality from LFS for large files. _FILE_OFFSET_BITS=N Select default filesystem interface. _BSD_SOURCE ISO C, POSIX, and 4.3BSD things. _SVID_SOURCE ISO C, POSIX, and SVID things. _GNU_SOURCE All of the above, plus GNU extensions. _REENTRANT Select additionally reentrant object. _THREAD_SAFE Same as _REENTRANT, often used by other systems. => -D_GNU_SOURCE wird benötigt.
Ich habe sogar schon im header-file selbst nachgeschaut und die Funktion wird dort deklariert! Weiß jemand woran das liegen könnte?
Brille vergessen ? ;)
Aber im Ernst, Du hättest dem __GNU_SOURCE nachgehen müssen, dann wärst
Du auf features.h gestossen (Muss man kennen, wenn man mit gcc arbeitet
und/oder sich mit portabler Programmierung auseinandersetzen will (Fast
alle Betriebssysteme und Compiler besitzen derartige Header).
Richtig(er) wäre:
# cat help.cc
#include
Ralf Corsepius wrote:
[C++ Code]
#include
#include
Frage am Rande: Sollte es be C++ nicht #include <iostream> etc. heissen? Also ohne die Endung .h? Nur mal so aus Interesse gefragt... CU, Th. -- Thomas Hertweck, Geophysicist Geophysical Institute, Karlsruhe University (TH) Hertzstr. 16, D-76187 Karlsruhe, Germany
On Don, 2001-09-06 at 11:49, Thomas Hertweck wrote:
Ralf Corsepius wrote:
[C++ Code]
#include
#include Frage am Rande: Sollte es be C++ nicht #include <iostream> etc. heissen? Also ohne die Endung .h? Nur mal so aus Interesse gefragt... Müssen - nein, können - ja, sollen - kommt darauf an, empfohen - ja.
Nach den neuen g++ und ANSI/ISO-C++-Standards wird durch die Verwendung
von Headern ohne .h auf die neuen C++-Standards umgeschaltet und '::'
(leerer Namespace) als Defaultnamespace verwendet.
(Siehe auch den C++-Abschnitt in http://gcc.gnu.org/bugs.html#known)
Eine entsprechende (gcc >= 3.0 konforme) Code-Variante sähe so aus
#include <iostream>
#include <cstring>
int main(){
std::cout << strnlen("SuSE-Hilfe", 5) ;
return 0 ;
}
Ältere g++ Version (egcs bis gcc-2.95.x) setzten 'std::' als
Defaultnamespace ein, womit dann das folgende ebenfalls gültig gewesen
wäre (Ist mit g++> 3.0 syntaktisch falsch!):
#include <iostream>
#include <cstring>
int main(){
cout << strnlen("SuSE-Hilfe", 5) ;
return 0 ;
}
Noch ältere g++-Versionen kannten keine Namespaces (gcc < egcs).
Bedeutet in der Summe also: Wenn Namespaces verwendet werden (sollen),
dann ohne *.h, wenn nicht, dann mit *.h oder using namespace std
einfügen.
Ein weiteres Problem mit dem Beispiel ist die Verwendung von
Ralf Corsepius wrote:
On Don, 2001-09-06 at 10:45, Sven Schiwek wrote:
Hallo Liste! Ich habe möchte die Funktion "strnlen" aus dem Headerfile "string.h" benutzen und laut man-Page habe ich alles richtig gemacht. Also bsp.
#include
int main(){ cout << strnlen("SuSE-Hilfe", 5); return } Mein Compiler (gpp) bricht beim Compilieren jedoch mit 'strnlen' undeclared first use this function ... ab.
aus man strnlen:
CONFORMING TO This function is a GNU extension.
Aus /usr/include/string.h:
#ifdef __USE_GNU [..] extern size_t strnlen (__const char *__string, size_t __maxlen) __THROW __attribute_pure__; #endif
Aus /usr/include/features.h
/* These are defined by the user (or the compiler) to specify the desired environment:
__STRICT_ANSI__ ISO Standard C. _ISOC99_SOURCE Extensions to ISO C89 from ISO C99. _POSIX_SOURCE IEEE Std 1003.1. _POSIX_C_SOURCE If ==1, like _POSIX_SOURCE; if >=2 add IEEE Std 1003.2; if >=199309L, add IEEE Std 1003.1b-1993; if >=199506L, add IEEE Std 1003.1c-1995 _XOPEN_SOURCE Includes POSIX and XPG things. Set to 500 if Single Unix conformance is wanted, to 600 for the upcoming sixth revision. _XOPEN_SOURCE_EXTENDED XPG things and X/Open Unix extensions. _LARGEFILE_SOURCE Some more functions for correct standard I/O. _LARGEFILE64_SOURCE Additional functionality from LFS for large files. _FILE_OFFSET_BITS=N Select default filesystem interface. _BSD_SOURCE ISO C, POSIX, and 4.3BSD things. _SVID_SOURCE ISO C, POSIX, and SVID things. _GNU_SOURCE All of the above, plus GNU extensions. _REENTRANT Select additionally reentrant object. _THREAD_SAFE Same as _REENTRANT, often used by other systems.
=> -D_GNU_SOURCE wird benötigt.
Ich habe sogar schon im header-file selbst nachgeschaut und die Funktion wird dort deklariert! Weiß jemand woran das liegen könnte?
Brille vergessen ? ;)
Aber im Ernst, Du hättest dem __GNU_SOURCE nachgehen müssen, dann wärst Du auf features.h gestossen (Muss man kennen, wenn man mit gcc arbeitet und/oder sich mit portabler Programmierung auseinandersetzen will (Fast alle Betriebssysteme und Compiler besitzen derartige Header).
Richtig(er) wäre:
# cat help.cc
#include
#include int main(){ cout << strnlen("SuSE-Hilfe", 5); return 0; } # g++ -Wall -D_GNU_SOURCE -o help help.cc
Ralf
Danke, das wars!!! Sven PS: Das strnlen eine C-Funktion ist weiß ich und diese mit cout zu benutzen ist natürlich nicht die feine Englische. Ich wollte einfach nur wissen warum das nicht funktioniert hat. -- _______Sven Schiwek_________________________________________________ | e-mail: sven.schiwek@gmx.net | www: http://sven-s.purespace.de | | sven.schiwek@web.de | http://www.azubi.ais-ag.de | |________________________Have a lot of Fun___________________________|
participants (4)
-
Hans-Werner Nanz
-
Ralf Corsepius
-
Sven Schiwek
-
Thomas Hertweck