Using constant variables in header file

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Karen

    Using constant variables in header file

    Hi,

    I have one constant variable and want to use it in two files. I put it in
    the header file and then include the header file. The compiler always say
    "error C2370: 'arraysize' : redefinition; different storage class". What
    shall I do? Files are listed below. I'm using Visual C++ 6.0

    By the way, how to use STL (vector , for example) to create a
    multi-dimension array?

    Many thanks.

    Karen
    ---------------------------------
    my header file - consts.h:
    const int arraysize = 15;

    my sources file 1 - op1.cpp:

    #include consts.h
    char array1[arraysize];

    my source file 2 - op2.cpp:

    #include consts.h
    char array2[arraysize];








  • Victor Bazarov

    #2
    Re: Using constant variables in header file

    "Karen" <Karen12000@yah oo.com> wrote...[color=blue]
    > I have one constant variable and want to use it in two files. I put it in
    > the header file and then include the header file. The compiler always say
    > "error C2370: 'arraysize' : redefinition; different storage class". What
    > shall I do? Files are listed below. I'm using Visual C++ 6.0
    >
    > By the way, how to use STL (vector , for example) to create a
    > multi-dimension array?
    >
    > Many thanks.
    >
    > Karen
    > ---------------------------------
    > my header file - consts.h:
    > const int arraysize = 15;
    >
    > my sources file 1 - op1.cpp:
    >
    > #include consts.h
    > char array1[arraysize];
    >
    > my source file 2 - op2.cpp:
    >
    > #include consts.h
    > char array2[arraysize];[/color]

    The only error I can see in those two translation units is that
    the #include directory doesn't have the header name in either
    double quotes or angle brackets. Beyond that, everything should
    be fine.

    Perhaps you should post the actual code that produces the error.

    To create a multidimensiona l array from std::vector, create
    a vector of vectors [of vectors ...] of the needed type:

    std::vector<std ::vector< ... <int> ... > > mda;

    Don't forget to resize the mda. Or you could initialise it
    with needed sizes for each dimension.

    Victor


    Comment

    • Victor Bazarov

      #3
      Re: Using constant variables in header file

      "Karen" <Karen12000@yah oo.com> wrote...[color=blue]
      > I have one constant variable and want to use it in two files. I put it in
      > the header file and then include the header file. The compiler always say
      > "error C2370: 'arraysize' : redefinition; different storage class". What
      > shall I do? Files are listed below. I'm using Visual C++ 6.0
      >
      > By the way, how to use STL (vector , for example) to create a
      > multi-dimension array?
      >
      > Many thanks.
      >
      > Karen
      > ---------------------------------
      > my header file - consts.h:
      > const int arraysize = 15;
      >
      > my sources file 1 - op1.cpp:
      >
      > #include consts.h
      > char array1[arraysize];
      >
      > my source file 2 - op2.cpp:
      >
      > #include consts.h
      > char array2[arraysize];[/color]

      The only error I can see in those two translation units is that
      the #include directory doesn't have the header name in either
      double quotes or angle brackets. Beyond that, everything should
      be fine.

      Perhaps you should post the actual code that produces the error.

      To create a multidimensiona l array from std::vector, create
      a vector of vectors [of vectors ...] of the needed type:

      std::vector<std ::vector< ... <int> ... > > mda;

      Don't forget to resize the mda. Or you could initialise it
      with needed sizes for each dimension.

      Victor


      Comment

      • Simon Elliott

        #4
        Re: Using constant variables in header file

        Karen <Karen12000@yah oo.com> writes[color=blue]
        >I have one constant variable and want to use it in two files. I put it in
        >the header file and then include the header file. The compiler always say
        >"error C2370: 'arraysize' : redefinition; different storage class". What
        >shall I do? Files are listed below. I'm using Visual C++ 6.0[/color]
        [color=blue]
        >---------------------------------
        >my header file - consts.h:
        >const int arraysize = 15;[/color]

        should that be:
        static const int arraysize = 15;

        By omitting the 'static' keyword, you're defining a variable with
        external linkage. You're only allowed to do this once.

        --
        Simon Elliott







        Comment

        • Victor Bazarov

          #5
          Re: Using constant variables in header file

          "Simon Elliott" <simon@nospam.d emon.co.uk> wrote...[color=blue]
          > Karen <Karen12000@yah oo.com> writes[color=green]
          > >I have one constant variable and want to use it in two files. I put it in
          > >the header file and then include the header file. The compiler always say
          > >"error C2370: 'arraysize' : redefinition; different storage class". What
          > >shall I do? Files are listed below. I'm using Visual C++ 6.0[/color]
          >[color=green]
          > >---------------------------------
          > >my header file - consts.h:
          > >const int arraysize = 15;[/color]
          >
          > should that be:
          > static const int arraysize = 15;[/color]

          Doesn't have to.
          [color=blue]
          >
          > By omitting the 'static' keyword, you're defining a variable with
          > external linkage. You're only allowed to do this once.[/color]

          See 3.5/3. 'const' objects have internal linkage if _not_ declared
          'extern' and _not_ previously declared to have external linkage.

          Victor


          Comment

          • Adam Fineman

            #6
            Re: Using constant variables in header file

            Karen wrote:[color=blue]
            > Hi,
            >
            > I have one constant variable and want to use it in two files. I put it in
            > the header file and then include the header file. The compiler always say
            > "error C2370: 'arraysize' : redefinition; different storage class". What
            > shall I do? Files are listed below. I'm using Visual C++ 6.0
            >
            > By the way, how to use STL (vector , for example) to create a
            > multi-dimension array?
            >
            > Many thanks.
            >
            > Karen
            > ---------------------------------
            > my header file - consts.h:
            > const int arraysize = 15;
            >
            > my sources file 1 - op1.cpp:
            >
            > #include consts.h[/color]

            #include "consts.h" // you forgot the quotes
            [color=blue]
            > char array1[arraysize];
            >
            > my source file 2 - op2.cpp:
            >
            > #include consts.h[/color]
            #include "consts.h"
            [color=blue]
            > char array2[arraysize];
            >[/color]

            The reason for the multiple definition error is that you need what's
            referred to as an include guard:

            //////////////////////////
            // consts.h

            #ifndef CONSTS_H_INCLUD ED
            #define CONSTS_H_INCLUD ED

            const int arraysize = 15;

            #endif // include guard
            /////////////////////////

            What that does is ensures that the header file is only included once in
            each compilation unit. Try that in your program, and then read up on
            include guards in your favorite reference book. There may also be
            something in the newsgroup's FAQ.

            - Adam

            --
            Reverse domain name to reply.

            Comment

            • Adam Fineman

              #7
              STL multi-dimensional arrays (Was: Using constant variables in headerfile)

              Karen wrote:
              <snip>[color=blue]
              >
              > By the way, how to use STL (vector , for example) to create a
              > multi-dimension array?
              >[/color]
              <snip>

              Something like this:

              //////////////////////////////////////////////////////////////
              #include <vector>
              #include <iostream>
              #include <iterator>

              int
              main()
              {
              typedef std::vector< std::vector<int > > table_t;

              table_t table;

              for (int i = 1; i <= 9; ++i)
              {
              std::vector<int > row;

              for (int j = 1; j <= 9; ++j)
              {
              row.push_back(i * j);
              }

              table.push_back (row);
              }

              int factor1 = 6, factor2 = 8;
              std::cout << factor1 << " times " << factor2 << " is "
              << table[factor1 - 1][factor2 - 1]
              << "\n\n";

              for (table_t::const _iterator r = table.begin();
              r != table.end();
              ++r)
              {
              copy(r->begin(), r->end(),
              std::ostream_it erator<int>(std ::cout, "\t"));
              std::cout << '\n';
              }

              return 0;
              }
              //////////////////////////////////////////////////////////////

              - Adam
              --
              Reverse domain name to reply.

              Comment

              • Jon Bell

                #8
                Re: STL multi-dimensional arrays (Was: Using constant variables in headerfile)

                In article <bxusb.622$WF2. 26841@news.uswe st.net>,
                Adam Fineman <afineman@retup moc.org> wrote:
                [snip][color=blue]
                > typedef std::vector< std::vector<int > > table_t;
                >
                > table_t table;
                >
                > for (int i = 1; i <= 9; ++i)
                > {
                > std::vector<int > row;
                >
                > for (int j = 1; j <= 9; ++j)
                > {
                > row.push_back(i * j);
                > }
                >
                > table.push_back (row);
                > }[/color]

                Or if you know the number of rows and columns in advance, you can
                construct the vector of vectors with that size:

                vector<vector<i nt> > table (numRows, vector<int>(num Cols))

                then fill it up just like you would an array.

                for (int row = 0; row < numRows; ++row)
                {
                for (col = 0; col < numCols; ++col)
                {
                table[row][col] = row * col;
                }
                }

                --
                Jon Bell <jtbellap8@pres by.edu> Presbyterian College
                Dept. of Physics and Computer Science Clinton, South Carolina USA

                Comment

                Working...