This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Undefine a library function


Undefining a libary function could be done very easily by using aspect-oriented-programming.


----- Original Message ----- From: "Tim Prince" <timothyprince@sbcglobal.net>
To: "Niklaus" <niklaus@gmail.com>
Cc: <tprince@myrealbox.com>; <gcc-help@gcc.gnu.org>
Sent: Friday, December 08, 2006 1:22 AM
Subject: Re: Undefine a library function



Niklaus wrote:
On 12/7/06, Tim Prince <timothyprince@sbcglobal.net> wrote:
Niklaus wrote:
> Hi,
> Like the #undef for macros , do we have a way for undefining a
> library function like say memset. Do we have any way(like linker) > so
> that my function memset(with different arguments) are used > everywhere
> instead of library function memset. One way would be to rename my
> function memset to mymemset or #define it . But i want to know > whether
> there is any hack or anything so that the library is included but > the
> memset used is mine instead of the library version.
>


Do you have an example where #undef doesn't accomplish what you want?
Evidently, many standard C functions will have macro replacements in the
standard headers used in your implementation. C standard requires
ability to put those aside with #undef and to have an underlying
separate library implementation, which you could attempt to preempt with
your own version.
It's common practice for compilers to #define memset() to a special
library version, but not with changes in the meaning of arguments. If
your own version is not functionally compatible with the standard
version, you are inviting trouble by using the standard name.

Yes here is some code. #include<stdio.h> #include<string.h>

int L[10][10];

#undef memset
/* if i include string.h it is compilation error, If i don't include i
get warning saying conflicting
types in library function . One way would be #define memset to
mymemset or some other function but can it not be done any other way
*/
void memset(void *mem,int c, int len);
void memset(void *mem,int c, int len)
{


    int *ptr=mem;
    while(len--)
        *ptr++=c;

    return;
}


int main() { int n=10,i,j,k,ll=-200; memset(L,2,100); }


You could #include <string.h> but you would have to make yours use the same data types, with parens around memset:
void (memset)(const void *mem, int c, size_t len){
char *ptr = mem;
...


Of course, you would optimize by setting a value of the widest native data type (128 bit on most current CPUs) to a string of characters of value c, but you must take care of the possible remainder values at each end. In addition
//off topic you would need to set a non-cached mode, where available


I don't see a purpose in your strange combination of K&R and standard C definition, plus some stuff of your own. If you do mean to set an array of ints, you shouldn't name it memset(), and there's a good chance your compiler would do better with a plain for loop.
Nor do I see the point of those who say any C implementation where there is a difference between size_t and int is broken, nor am I interested in discussion of it.




Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]