Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > fgets prototype doesn't include const?

Reply
Thread Tools

fgets prototype doesn't include const?

 
 
jaime
Guest
Posts: n/a
 
      08-13-2007
Hi all.

According to the fgets wikipedia page, its prototype is:

char* fgets(char *string, int length, FILE * stream)

Given that fgets never assigns to the first parameter (the char
pointer), could the prototype also have been defined as:

char* fgets(char * const string, int length, FILE * stream)

Am I missing something here? (or is it really that "const"s are frequently
omitted?)

TIA, Jaime
 
Reply With Quote
 
 
 
 
Chris Dollin
Guest
Posts: n/a
 
      08-15-2007
jaime wrote:

> According to the fgets wikipedia page, its prototype is:
>
> char* fgets(char *string, int length, FILE * stream)


Yes.

> Given that fgets never assigns to the first parameter (the char
> pointer), could the prototype also have been defined as:
>
> char* fgets(char * const string, int length, FILE * stream)


Doesn't make any difference.

> Am I missing something here?


Putting that `const` in the prototype is irrelevant. It makes a
difference in the function /definition/, where it makes the
pointer un-assignableto, but that's not of interest in the
prototype declaration, since one can't assign to the parameter
anyway [1].

[1] Apart from the initialisation on the call, of course.

--
Hewlett-Packard Limited registered office: Cain Road, Bracknell,
registered no: 690597 England Berks RG12 1HN

 
Reply With Quote
 
 
 
 
Richard Heathfield
Guest
Posts: n/a
 
      08-15-2007
jaime said:

> Hi all.
>
> According to the fgets wikipedia page, its prototype is:
>
> char* fgets(char *string, int length, FILE * stream)
>
> Given that fgets never assigns to the first parameter (the char
> pointer), could the prototype also have been defined as:
>
> char* fgets(char * const string, int length, FILE * stream)
>
> Am I missing something here? (or is it really that "const"s are
> frequently omitted?)


You are indeed missing something. It is not guaranteed that fgets never
assigns to the first parameter, and it wouldn't matter if it did, since
C is pass-by-value, so there's no particular value in making the input
parameter const. To do so would place an entirely unnecessary
restriction on the implementation of fgets.

For example, it might want to work something like this:

#include <stdio.h>

/* beware - this is just a sketch, not a tested implementation */
char *fgets(char *_b, int _n, FILE *_f)
{
char *_r = _b;
while(_n-- > 1 && (*_b = getc(_f)) != EOF)
{
++_b; /* _b is modified here - this is a local change, affecting
only the object owned by fgets - it doesn't have any
effect on the value of the object used in the argument
expression during the call. */
}
if(*_b != EOF)
{
*_b = '\0';
}
else
{
_r = NULL;
}
return _r;
}

If _b were const-qualified, this code would not compile.

--
Richard Heathfield <http://www.cpax.org.uk>
Email: -www. +rjh@
Google users: <http://www.cpax.org.uk/prg/writings/googly.php>
"Usenet is a strange place" - dmr 29 July 1999
 
Reply With Quote
 
jxh
Guest
Posts: n/a
 
      08-15-2007
On Aug 15, 4:41 am, Richard Heathfield <(E-Mail Removed)> wrote:
[snip]
>
> #include <stdio.h>
>
> /* beware - this is just a sketch, not a tested implementation */


Good thing for the warning. A couple of fixups are needed.

> char *fgets(char *_b, int _n, FILE *_f)
> {
> char *_r = _b;

int _c;
while(_n-- > 1 && (_c = getc(_f)) != EOF)
> {

*_b++ = _c;
> /* _b is modified here - this is a local change, affecting
> only the object owned by fgets - it doesn't have any
> effect on the value of the object used in the argument
> expression during the call. */

if (_c == '\n')
{
break;
}
> }

if(_c != EOF)
> {
> *_b = '\0';
> }
> else
> {
> _r = NULL;
> }
> return _r;
>
> }


-- James

 
Reply With Quote
 
Richard Heathfield
Guest
Posts: n/a
 
      08-15-2007
jxh said:

> On Aug 15, 4:41 am, Richard Heathfield <(E-Mail Removed)> wrote:
> [snip]
>>
>> #include <stdio.h>
>>
>> /* beware - this is just a sketch, not a tested implementation */

>
> Good thing for the warning.


Nevertheless, good catches.

<snip>

--
Richard Heathfield <http://www.cpax.org.uk>
Email: -www. +rjh@
Google users: <http://www.cpax.org.uk/prg/writings/googly.php>
"Usenet is a strange place" - dmr 29 July 1999
 
Reply With Quote
 
pete
Guest
Posts: n/a
 
      08-15-2007
jaime wrote:
>
> Hi all.
>
> According to the fgets wikipedia page, its prototype is:
>
> char* fgets(char *string, int length, FILE * stream)
>
> Given that fgets never assigns to the first parameter (the char
> pointer), could the prototype also have been defined as:
>
> char* fgets(char * const string, int length, FILE * stream)
>
> Am I missing something here?
> (or is it really that "const"s are frequently omitted?)


What you are missing is that consts
are always omitted on the parameters.

There are no const qualified parameters
in any standard library function,
for reasons that Richard Heathfield has
already explained elsewhere in this thread.

--
pete
 
Reply With Quote
 
CBFalconer
Guest
Posts: n/a
 
      08-16-2007
pete wrote:
> jaime wrote:
>>
>> According to the fgets wikipedia page, its prototype is:
>>
>> char* fgets(char *string, int length, FILE * stream)
>>
>> Given that fgets never assigns to the first parameter (the char
>> pointer), could the prototype also have been defined as:
>>
>> char* fgets(char * const string, int length, FILE * stream)
>>
>> Am I missing something here?
>> (or is it really that "const"s are frequently omitted?)

>
> What you are missing is that consts are always omitted on the
> parameters. There are no const qualified parameters in any
> standard library function, for reasons that Richard Heathfield
> has already explained elsewhere in this thread.


You are mistaken. Here is an example from N869:

7.21.2.3 The strcpy function

Synopsis
[#1]
#include <string.h>
char *strcpy(char * restrict s1,
const char * restrict s2);

--
Chuck F (cbfalconer at maineline dot net)
Available for consulting/temporary embedded and systems.
<http://cbfalconer.home.att.net>



--
Posted via a free Usenet account from http://www.teranews.com

 
Reply With Quote
 
Richard Heathfield
Guest
Posts: n/a
 
      08-16-2007
CBFalconer said:

> pete wrote:

<snip>
>>
>> What you are missing is that consts are always omitted on the
>> parameters. There are no const qualified parameters in any
>> standard library function, for reasons that Richard Heathfield
>> has already explained elsewhere in this thread.

>
> You are mistaken. Here is an example from N869:
>
> 7.21.2.3 The strcpy function
>
> Synopsis
> [#1]
> #include <string.h>
> char *strcpy(char * restrict s1,
> const char * restrict s2);


You are mistaken. The constness here applies to the thing pointed at,
not the pointer itself (i.e. the parameter, which is what pete was
talking about).

--
Richard Heathfield <http://www.cpax.org.uk>
Email: -www. +rjh@
Google users: <http://www.cpax.org.uk/prg/writings/googly.php>
"Usenet is a strange place" - dmr 29 July 1999
 
Reply With Quote
 
Justin Spahr-Summers
Guest
Posts: n/a
 
      08-16-2007
On Aug 15, 10:15 pm, CBFalconer <(E-Mail Removed)> wrote:
> pete wrote:
> > What you are missing is that consts are always omitted on the
> > parameters. There are no const qualified parameters in any
> > standard library function, for reasons that Richard Heathfield
> > has already explained elsewhere in this thread.

>
> You are mistaken. Here is an example from N869:
>
> 7.21.2.3 The strcpy function
>
> Synopsis
> [#1]
> #include <string.h>
> char *strcpy(char * restrict s1,
> const char * restrict s2);


While that prototype does use the "const" keyword, the parameter
itself is not constant. In this instance, it means that the characters
pointed to by "s2" will not be modified. The others were discussing
definitions such as:

char *strcpy(char * const restrict s1, const char * const restrict
s2);

in which the values of the parameters themselves would not be able to
be changed in the implementation of the function, which is kind of a
ridiculous restriction, seeing as it does not affect the calling code.

 
Reply With Quote
 
CBFalconer
Guest
Posts: n/a
 
      08-16-2007
Richard Heathfield wrote:
> CBFalconer said:
>> pete wrote:
>>

> <snip>
>>>
>>> What you are missing is that consts are always omitted on the
>>> parameters. There are no const qualified parameters in any
>>> standard library function, for reasons that Richard Heathfield
>>> has already explained elsewhere in this thread.

>>
>> You are mistaken. Here is an example from N869:
>>
>> 7.21.2.3 The strcpy function
>>
>> Synopsis
>> [#1]
>> #include <string.h>
>> char *strcpy(char * restrict s1,
>> const char * restrict s2);

>
> You are mistaken. The constness here applies to the thing pointed
> at, not the pointer itself (i.e. the parameter, which is what
> pete was talking about).


I don't even consider that, since parameters are by value, and any
const attribute can't possibly affect the caller in any way. To my
mind your restriction is totally useless.

--
Chuck F (cbfalconer at maineline dot net)
Available for consulting/temporary embedded and systems.
<http://cbfalconer.home.att.net>



--
Posted via a free Usenet account from http://www.teranews.com

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Prototype WTP 0.2 released,this release for Prototype 1.6.0 javascript fish Javascript 0 10-11-2008 07:35 AM
Class prototype vs C function prototype June Lee C++ 2 04-13-2008 08:17 PM
/* #include <someyhing.h> */ => include it or do not include it?That is the question .... Andreas Bogenberger C Programming 3 02-22-2008 10:53 AM
Prototype Object.extend(new Base() | Hash | Hash.prototype) usage: jacobstr@gmail.com Javascript 3 03-27-2007 07:56 AM
relation between prototype and Prototype.js shypen42@yahoo.fr Javascript 9 05-26-2006 01:13 AM



Advertisments