Article View: comp.std.c
Article #2932Re: Maximum depth of #if preprocessing directives
From: Steve Clamage
Date: Wed, 30 Dec 1992 18:49
Date: Wed, 30 Dec 1992 18:49
103 lines
5899 bytes
5899 bytes
gordon@sneaky.lonestar.org (Gordon Burditt) writes: [ Jerry Schwarz writes: ] >>Just to put my cards on the table. X3J16/SC22 (C++ standards >>committee) is sharply divided on whether to have a section on >>limits. Some of us, including myself, argue that without such >>a section any limit is a bug. With such a section arbitrary limits >>are somehow condoned as suggested by Norman's comment, and we >>don't want to condone any limits. >How can you possibly avoid some kind of limit? Even an implementation >that uses arbitrary-precision arithmetic for something such as >#if nesting level is going to have SOME limit, like >2^(MAXLONG*sizeof(unsigned long)*CHAR_BIT) (where ^ is an exponentiation >operator), even if it's outrageously large. >Is 32767 an unreasonable limit on the nesting level? Well, it wouldn't >cost that much to put the counts in a 32-bit long. Do I need to go to >(about) 2^(2^37)? (about 137 billion bits in the number) Or is that >too small? I share Jerry's position, that the Standard should not contain limits. Let me note that Jerry and I are each compiler implementors, and all our compilers (from different companies) easily exceed all the limits in the C Standard. So we aren't writing out of fear that our compilers will become invalid. We are concerned about the consequences to the C and C++ communities of limits in the Standard. No other language standard imposes such limits. I wrote a paper on this topic for the C++ Committee. I can't go into all the details here, but let's consider nesting levels as an example. Suppose the Standard says 8 levels. Some programmers will need more than 8. The compiler is not obligated to support more than 8, and if it doesn't, the user can only beg for more levels. But since you can't depend on more than 8, you better not use more than 8 in any program which is supposed to be portable. Many programming shops have rules that you can't write a program which violates any portability rules in the Standard. In this way, the "minimum" in the Standard becomes a real-world "maximum" for programmers. Programs which need more than 8 levels have to be bent to conform to the limit, becoming harder to understand and maintain. You can substitute any small integer for 8, or choose any other limit in the C standard, and get a similar situation. Now let's make the limit 32767 for nested includes. Surely no program will need more than that. (Except for poor Pat, who desperately needs 32803, but Pat is out of luck.) Most (all?) operating systems won't allow a program (the compiler) to open that many files simultaneously. This means the compiler has to have a mechanism to close and reopen files as needed, seeking to a remembered location, when the local limit on open files has been exceeded. Sometimes the limit is system-wide, sometimes each process might have an individual limit; the compiler has to be able to figure out what the limit is or just have a fixed conservative limit. Now we have imposed this elaborate mechanism on all compilers and all users, who have a bigger and slower compiler as a result. Most users will never need so many nested includes, but they all pay the penalty. Further, there may be some systems on which you can't have 32767 files at all. Such a system cannot have a Standard-conforming compiler, since it can't pass the nested-include test. The Standard will have disenfranchised small computer systems; only big systems can have a validated compiler. Once again, substitute other numbers and other limits from the Standard to get similar situations. Please don't point out that you can handle the above problem by clever coding and avoid penalties when the limits aren't exercised. The overall impact is still to make compilers bigger and more complex if they must meet artificially large limits. Now suppose that the Standard does not mention any limit on nested includes. Every real compiler will have a limit of some kind. If you need more than that, the compiler vendor can't hide behind the Standard. Failure to handle an #include is a bug. One hopes that the vendor will make as many nested includes available as makes sense on the system. If you need more than are available, you can lobby the vendor, or find another one with more capacity. A vendor who supplies a "conforming" implementation with only 1 level of include won't have any customers. Some compiler implementations may find a niche by making small fast compilers of limited capacity which conform to all explicit requirements in the Standard. You might choose the limited-capacity compiler if you are programming a small system. The compiler can be validated, and you can expect your conforming code to work. When choosing a compiler, there are many things you need to consider. If you are programming a large system, you need a compiler with large limits, no matter what the Standard says. A conforming compiler which does not meet your needs is of no use. If you are programming a small system, you don't care about limits, but you will want a conforming compiler nontheless. I favor listing characteristics which a conforming implementation is required to document. Just like choosing any other program, you could then choose a compiler which meets your needs. -- Steve Clamage, TauMetric Corp, steve@taumet.com
Technical Details
Message-ID:
<1992Dec30.184909.23125@taumet.com>Path:
arc1-ca.pugleaf.net!sparky!uunet!taumet!steveReferences:
<JET.92Dec24133237@boxer.nas.nasa.gov> <BzsK12.5Ky@jrd.dec.com> <1992Dec29.001933.25655@lucid.com> <C01q3x.Bpp@sneaky.lonestar.org>Show Full Headers
Complete Article Headers
Newsgroups: comp.std.c Path: arc1-ca.pugleaf.net!sparky!uunet!taumet!steve From: steve@taumet.com (Steve Clamage) Subject: Re: Maximum depth of #if preprocessing directives Message-ID: <1992Dec30.184909.23125@taumet.com> Organization: TauMetric Corporation References: <JET.92Dec24133237@boxer.nas.nasa.gov> <BzsK12.5Ky@jrd.dec.com> <1992Dec29.001933.25655@lucid.com> <C01q3x.Bpp@sneaky.lonestar.org> Date: Wed, 30 Dec 1992 18:49:09 GMT Lines: 103