throopw@dg_rtp.UUCP (Wayne Throop) (07/03/86)
> markb@sdcrdcf.UUCP (Mark Biggar) > IT still doesn't work for REGISTER variables! True, true. Both K&R and the draft standard explicitly deem this illegal. But it is worth noting what Harbison and Steele have to say about it: 7.4.6 Address Operator [blah, blah, blah, blah, and then the interesting part] The original description of C specified that it was illegal to apply the unary address operator '&' to a register variable, and some compilers still enforce this restriction. However, since register is treated only as a hint to the compiler and not a mandatory requirement, it seems appropriate to allow such usage, inasmuch as on some computers the registers really are addressable as if they were memory locations. On the other hand, when the target computer does not have addressable registers, applying '&' to a register variable may simply defeat the declaration of the variable as register, forcing it to be of class auto instead. We recommend that new compilers take this latter approach and perhaps also issue a warning message. In any case, such usage should be regarded as nonportable. This makes three points: - 'register' is "only" a hint to the compiler, and the declaration of a variable as register does not ensure that the variable *will* be in a register - therefore, '&' of register variables "ought" to be allowed, and simply be one of those cases where the compiler might be compelled to ignore the register hint - (despite this "ought", it is certainly non-portable, given current compilers and draft standards) And to conclude, remember that the original posting in this series was a request to make a macro "swap" such that swap( *a++, *b++ ); would work, and the posted examples would work even if a and b were declared register. -- "Eschew obfuscation." "Giesundheit!" -- Wayne Throop <the-known-world>!mcnc!rti-sel!dg_rtp!throopw