_ and __ significance

Discussion in 'C Programming' started by g.ankush1, Sep 25, 2006.

  1. g.ankush1

    g.ankush1 Guest

    I have seen many variables or structures declared as _ or __ prefixed .
    Can anyone explain the significance of _ or __ particularly . I mean ,
    I wanted to know the convention for using _ and __ .
    g.ankush1, Sep 25, 2006
    1. Advertisements

  2. g.ankush1

    kondal Guest

    There is no particulat meaning in using _ or __ except that of a
    general convention used to identify system variables/functions by
    single underscore and metadata identified by double underscored.

    kondal, Sep 25, 2006
    1. Advertisements

  3. g.ankush1

    g.ankush1 Guest

    Thanks for your reply. But ould you please explain metadata in a bit

    g.ankush1, Sep 25, 2006
  4. g.ankush1

    Bart Guest

    Someone else will probably quote the exact legalese, but in general,
    you shouldn't use names that begin with underscores because these names
    can be reserved for various uses by your compiler/implementation.
    Underscores inside names are often used to make identifiers more
    readable - e.g. NUM_ITEMS instead of NUMITEMS.

    Bart, Sep 25, 2006
  5. g.ankush1

    Eric Sosman Guest

    C has a problem: When you #include a header like <stdio.h>
    your program suddenly acquires declarations of functions like
    printf() and fopen() -- which is what you wanted -- but it
    usually also acquires declarations of some of the private
    details of the standard library. For example, <stdio.h> must
    declare FILE* as a type, and quite often has to declare a FILE
    struct to do so. Many <ctype.h> implementations declare special
    arrays that describe the attributes of different character values.
    And so on: C's problem is that it is difficult to declare all the
    "public" stuff properly without making some of the "private" stuff
    visible at the same time.

    Why is that a problem? Some of the "private" stuff needs
    names -- the names of the elements in a FILE struct, or of the
    special <ctype.h> arrays, for example -- and chaos will result if
    those names collide with others that the programmer has chosen for
    his own purposes. If a hypothetical <ctype.h> did this:

    extern char lower[1+256];
    #define tolower(c) lower[1+(c)]

    there would be trouble if your program started out with

    #include <ctype.h>
    int higher = 1;
    int lower = -1;

    because `lower' is being used to refer to two different things
    and the uses can't be resolved contextually.

    C "solves" this problem by dividing programmers into two
    groups: Those who write the C implementation and those who use
    C to write other things. The Standard then reserves one family
    of identifiers for use by the implementors, and another family
    for the users: The implementors may not use `lower' lest it clash
    with an identifier a user might choose, and the users must not
    use `_lower' because that's a name reserved for implementors' use.
    (This is a slightly simplified version of affairs; the actual
    situation is somewhat more involved. Roughly speaking, though,
    users should not declare identifiers that start with underscores
    and implementors should not declare identifiers that start with
    letters -- there's a long list of exceptions and special cases,
    but it's hardly worth trying to remember them all.)

    So: When you see `extern struct _io _iob[3];' in a system
    header this is *not* an encouragement to use names like _io and
    _iob in your own code. Rather, it's the implementor staying out
    of your way by using special names for the things he needs to
    give names to.
    Eric Sosman, Sep 25, 2006
  6. More specific answers to your query have been given elsethread, but one
    thing you might want to keep in mind is that the underscore character is
    allowable in a C identifier.

    While this is an obvious statement, it highlights the fact that any
    conventions and standards are just that; conventions we've placed on the
    use of characters in C identifiers.
    Clever Monkey, Sep 25, 2006
  7. g.ankush1

    pete Guest

    The point though, according to the rules of the language,
    is that identifiers which are prefixed by _ or __
    are "reserved identifiers" with some exceptions,
    and that you should generally avoid using them.
    pete, Sep 25, 2006
  8. g.ankush1

    Jack Klein Guest

    You are completely wrong. There is no "general convention". There is
    a namespace reserved for the implementation by the C language
    Jack Klein, Sep 26, 2006
  9. g.ankush1

    kondal Guest

    I used the phrase 'general convention' because C language doesn't stop
    me in using a underscore in variables. How can you say it is reserved
    namespace only for the C language standard and usable only by the C
    language implementors.

    kondal, Sep 26, 2006
  10. g.ankush1

    kondal Guest

    metadata is nothing but 'data describing data'. It is useally used for
    data processing systems/protocols where you have data that can fit to a
    structure. This structure is dynamically created using another
    sturcture which is called metadata.

    Its like XML describes the data and XML scheme definition (I suppose
    that is what it is called) describes the XML.

    kondal, Sep 26, 2006
  11. kondal said:

    It does, however, warn you off from using them at the beginning of your
    identifier names. In 1977, a 19-year-old trackside fire marshal - Jansen
    van Vuuren - followed the "general convention" (anyone coming? No, okay, so
    it must be safe to cross, right?), and crossed Kyalami carrying a fire
    extinguisher. In so doing, he invaded racing-car space. Tom Pryce's car
    struck him a second or two later. Both Pryce and van Vuuren were killed.

    Stay out of implementation namespace.

    4.1.2: "All external identifiers that begin with an underscore are reserved.
    All other identifiers that begin with an underscore and either an
    upper-case letter or another underscore are reserved."
    Richard Heathfield, Sep 26, 2006
  12. g.ankush1

    kondal Guest

    Thank you. Can you tell me which C compiler is close to C spec? I
    generally use gcc and it didn't give me any warning.

    kondal, Sep 26, 2006
  13. kondal said:
    C compilers are only required to give diagnostic messages for syntax errors
    and constraint violations. Invading implementation namespace is neither of
    those, so no message is required.

    You have *had* your warning, right there in 4.1.2: "Don't. Do. This." You
    shouldn't need another.
    Richard Heathfield, Sep 26, 2006
  14. g.ankush1

    kondal Guest

    OK, I understand.
    identifier names.

    My curiosity is to know which C compiler gives the warning. If it is
    defined only in C spec and not used by the compilers then what is the
    use? I do not want to initiate any argument here, it could just be that
    nobody cares about it.

    I've seen lot of source codes which use underscores for structure names
    and variables. as I said gcc (v 3.2.2) doesn't produce any warning.

    kondal, Sep 26, 2006
  15. kondal said:
    No, the *Standard* warns you off from using leading underscores.
    The C compilers DO use identifiers with leading underscores, and that's why
    you shouldn't.

    Look, it's very simple.

    You stay over here. The compiler writer stays over there. You don't get in
    his way, and he won't get in yours. Easy.
    Well, I care about not using identifiers that the implementation uses,
    because I would like my programs to work. If you don't need your programs
    to work, there is no need for you to care.
    As I've said, it doesn't have to. You had your warning already, in the C
    Standard. If you can't be bothered to pay attention to that warning, why
    would you bother to pay any attention to gcc's warning, were it to give
    Richard Heathfield, Sep 26, 2006
  16. g.ankush1

    Bart Guest

    I don't think so.
    How would a compiler know when to give a warning? Let's say you
    #include <stdio.h> in your program and that header declares names such
    as _iobuf, how would the compiler distinguish between code that you
    wrote and code from the standard header?
    The code of your standard library is not a good example to follow. As
    mentionned before, those who write <stdio.h> and other standard library
    headers are allowed to use names that begin with underscores. You are
    not allowed to use those same names. In this way, you don't conflict
    with them.

    Bart, Sep 26, 2006
  17. Well, not everyone has committed every paragraph of the Standard to
    memory (or can tease out the meaning in all the paragraphs if they had!)
    In this case one would not know they have violated the Standard, even
    if they were the type of person who might otherwise pay attention to a

    It does not follow that accidental ignorance of some paragraphs
    indicates that the coder is more likely to ignore an honest-to-gods

    Simply put, even coders familiar with a good chunk of the Standard may
    just know that an underscore is a valid identifier character and that
    they've seen the identifier used in some specific cases. This might
    lead to the incorrect assumption that this is merely a naming convention
    (much like commenting styles, or brace placement, or Hungarian notation).

    Perhaps I'm admitting to some terrible sin, but I will never commit the
    entire Standard to memory, and know that even if I did I might come up
    with some creative misunderstandings on implementation.

    So, it follows that I will continue to discover new aspects of the
    language and correct incorrect assumptions over time. Since I sometimes
    try to participate in Real Life, and only partly spend my time with C,
    this is a reasonable limitation I've learned to accept!

    This does not mean that I would necessarily ignore a diagnostic.
    Clever Monkey, Sep 26, 2006
  18. Clever Monkey said:

    There's your problem right there! ;-)
    Richard Heathfield, Sep 26, 2006
  19. None, to my knowledge.
    Compiler and C standard library writers can use it in their code.
    Its not required to.
    Mark McIntyre

    "Debugging is twice as hard as writing the code in the first place.
    Therefore, if you write the code as cleverly as possible, you are,
    by definition, not smart enough to debug it."
    --Brian Kernighan
    Mark McIntyre, Sep 27, 2006
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.