On Thu, Mar 25, 2004 at 10:49:54AM +0100, David Jansen wrote:
I have to install a program here at work that compiles fine on SuSe
and
on RedHat 9, but not on FC1.
After experimenting with the routines and eliminating everything that is
not necessary to reproduce the bug, this is what it boils down to:
$ cat test1.c
void test1()
{
#include <sys/file.h>
return(0);
}
$ gcc -o test1.o -c test1.c
In file included from /usr/include/sys/types.h:219,
from /usr/include/bits/fcntl.h:25,
from /usr/include/fcntl.h:33,
from /usr/include/sys/file.h:25,
from test1.c:3:
/usr/include/sys/sysmacros.h: In function `test1':
/usr/include/sys/sysmacros.h:43: error: nested function `gnu_dev_major' declared
`extern'
/usr/include/sys/sysmacros.h:49: error: nested function `gnu_dev_minor' declared
`extern'
/usr/include/sys/sysmacros.h:55: error: nested function `gnu_dev_makedev' declared
`extern'
Now that's easy to fix; if I move the #include out of the function to
the top of the source file, it compiles woithout any problems. Only the
package author didn't accept this "patch", stating that the program is
correct and the bug is in the fedora includes or gcc version.
What is your collective wisdom on this subject?
The package author is wrong. IEEE Std 1003.1-2001 XSH 2.2.2 says
(see
http://www.opengroup.org/onlinepubs/007904975/functions/xsh_chap02_02.htm...
) says:
"If used, the application shall ensure that a header is included outside
of any external declaration or definition, " ...
Although #include <sys/file.h> is not a POSIX standard header and is not
governed by this standard, it includes <fcntl.h> which is a POSIX header.
The testcase above includes (indirectly) a standard header inside of a
function definition and thus violates the POSIX requirements.
Jakub