Portable Code
Mark Horton
mark at cbnews.ATT.COM
Sat Jul 30 01:06:44 AEST 1988
In article <1157 at radio.toronto.edu> brian at radio.astro.toronto.edu (Brian Glendenning) writes:
>
>So I thought I'd ask the net for advice about how to write portable code. I
>know the topic is incredibly broad, but I expect I'm not the only person on
>the net who could benefit from some advice (e.g., people like myself who
>aren't primarily programmers and don't know the lore and wisdom of
>professionals).
Professionals have to learn this stuff some way too, and up until now the
only option is experience and the seat of your pants.
You might be interested in an upcoming book I'm writing called "How to
Write Portable Software in C". It covers most of these sorts of issues.
It's from Prentice Hall and should hit the stores next spring or summer.
>Some issues that could be addressed:
>
> 1) Byte order and type size differences. What is the best way for
> dealing with these? What are the "gotcha"'s?
In general, don't make assumptions about them. Things like
int c;
read(0, &c, 1);
if (c == '\n')
will work on a little endian machine like a VAX but fail on a big
endian machine like a Sun. There are zillions of potential gotchas
like this, all of which come from assuming something in the folklore
but not in the manual. (You aren't supposed to read into ints, just
into chars, if you intend the data type to be a char.)
> 2) BSD/SysV/whatever differences. What assumptions are likely to
> lead me into trouble?
Zillions of them. Without the book, which lists the functions and rates
their portability, your best bet is to get both a System V and a 4BSD
manual and verify that everything you do is in both manuals. That is far
easier said than done. A typical UNIX system manual will imply that
everything in it is portable, including the local enhancements that are
not present anywhere else.
> 3) Source code management: what's the best way to maintain codes that
> run on a variety of machines. #ifdef MACHINE_TYPE? Never or rarely
> use #ifdef, edit makefiles? ???
There are several choices:
#ifdef vax
This is useful if you need to key on the hardware type.
It's automatically defined by cpp.
#ifdef SYSV
Useful to key on the operating system. You have to define
this with -D or #define.
#ifdef DBM
Keying on a particular feature or option you need, you might
have several of these and allow each to be configured. You
must define these yourself.
#ifdef FIONREAD
Keying on some constant in a header file that is an indicator
of whether the feature you need is present. These are
automatic but you can't always use them. In this case you
might be using this ifdef to protect an ioctl(.. FIONREAD ..)
> 4) Everything I've forgotten :-)
It took a 350 page book to cover this, so it's hard to do in a Usenet
message. I recommend buying the book, if you can wait.
Mark Horton
More information about the Comp.lang.c
mailing list