Discussion:
Undefine a library function
Niklaus
2006-12-07 14:36:45 UTC
Permalink
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.

Regds
Nik
Tim Prince
2006-12-07 15:01:17 UTC
Permalink
Post by Niklaus
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.
Niklaus
2006-12-08 04:07:49 UTC
Permalink
Post by Tim Prince
Post by Niklaus
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);
}
Tim Prince
2006-12-08 06:22:28 UTC
Permalink
Post by Niklaus
Post by Tim Prince
Post by Niklaus
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.
Michael Gong
2006-12-08 14:04:10 UTC
Permalink
Undefining a libary function could be done very easily by using
aspect-oriented-programming.


----- Original Message -----
From: "Tim Prince" <***@sbcglobal.net>
To: "Niklaus" <***@gmail.com>
Cc: <***@myrealbox.com>; <gcc-***@gcc.gnu.org>
Sent: Friday, December 08, 2006 1:22 AM
Subject: Re: Undefine a library function
Post by Tim Prince
Post by Niklaus
Post by Tim Prince
Post by Niklaus
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
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.
Sai LUO
2006-12-08 15:25:08 UTC
Permalink
Aspect-oriented programming is mostly used in Java language. Is there
any AOP-enabled C compiler and linker?
Post by Michael Gong
Undefining a libary function could be done very easily by using
aspect-oriented-programming.
----- Original Message -----
Sent: Friday, December 08, 2006 1:22 AM
Subject: Re: Undefine a library function
Post by Tim Prince
Post by Niklaus
Post by Tim Prince
Post by Niklaus
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
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.
--
Sai
Michael Gong
2006-12-08 15:31:57 UTC
Permalink
www.aspectc.net

We have a research project : AspectC. It is similiar with AspectJ, but
is targeted to C. It is a source-to-source transformation tool, so no
special linker is required.

Actually, there are some other projects of applying AOP on C. You could
find @ : http://www.aosd.net/wiki/index.php?title=Aspects_in_C


----- Original Message -----
From: "Sai LUO" <***@gmail.com>
To: "Michael Gong" <***@cs.toronto.edu>
Sent: Friday, December 08, 2006 10:24 AM
Subject: Re: Undefine a library function
Post by Sai LUO
Aspect-oriented programming is mostly used in Java language. Is there
any AOP-enabled C compiler and linker?
Post by Michael Gong
Undefining a libary function could be done very easily by using
aspect-oriented-programming.
----- Original Message -----
Sent: Friday, December 08, 2006 1:22 AM
Subject: Re: Undefine a library function
Post by Tim Prince
Post by Niklaus
Post by Tim Prince
Post by Niklaus
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
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.
--
Sai
Continue reading on narkive:
Loading...