locked
why does the order of this #includes matter RRS feed

  • Question

  •   please can some tell me why #include "Sales_item.h" #include<iostream> wouldn't compile, but #include<iostream> #include "Sales_item.h" compiles. the same, but different order.
    it gave me 3 errors

        1) Severity Code Description Project File Line
        Error (active)  linkage specification is incompatible with previous "lround" (declared at line 76 of "c:\Users\evan_2\Documents\Visual Studio 2015\Projects\ConsoleApplication1\ConsoleApplication1\Version_test.h") ConsoleApplication1 c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\xtgmath.h 201

        2) Severity Code Description Project File Line
        Error C2375 'lround': redefinition; different linkage ConsoleApplication1 c:\program files (x86)\windows kits\10\include\10.0.10150.0\ucrt\math.h 509

        3) Severity Code Description Project File Line
        Error (active)  linkage specification is incompatible with previous "lround" (declared at line 76 of "c:\Users\evan_2\Documents\Visual Studio 2015\Projects\ConsoleApplication1\ConsoleApplication1\Version_test.h") ConsoleApplication1 c:\Program Files (x86)\Windows Kits\10\Include\10.0.10150.0\ucrt\math.h 509



        // THIS IS THE MAIN CODE:

        #include "stdafx.h"

        #include "Sales_item.h"
        #include<iostream>



        int main()
        {
         Sales_item item1;

         int x{}, y{}, z{};

         std::string isbn1{ "0-201-78345-X" }, isbn2{ "0-201-70353-X" };

         while (std::cin >> item1)
         {
          if (item1.isbn() == isbn1)
          {
           ++x;
          }
          else if (item1.isbn() == isbn2)
          {
           ++y;
          }
          else {
           ++z;
          }
         }

         std::cout << "0-201-78345-X :" << x << std::endl;
         std::cout << "0-201-70535-X :" << y << std::endl;
         std::cout << "0-201-78645-X :" << z << std::endl;
         return 0;
        }



        // THE SALES_ITEM.H CODE:

        #pragma once

        /*
        * This file contains code from "C++ Primer, Fifth Edition", by Stanley B.
        * Lippman, Josee Lajoie, and Barbara E. Moo, and is covered under the
        * copyright and warranty notices given in that book:
        *
        * "Copyright (c) 2013 by Objectwrite, Inc., Josee Lajoie, and Barbara E. Moo."
        *
        *
        * "The authors and publisher have taken care in the preparation of this book,
        * but make no expressed or implied warranty of any kind and assume no
        * responsibility for errors or omissions. No liability is assumed for
        * incidental or consequential damages in connection with or arising out of the
        * use of the information or programs contained herein."
        *
        * Permission is granted for this code to be used for educational purposes in
        * association with the book, given proper citation if and when posted or
        * reproduced.Any commercial use of this code requires the explicit written
        * permission of the publisher, Addison-Wesley Professional, a division of
        * Pearson Education, Inc. Send your request for permission, stating clearly
        * what code you would like to use, and in what specific way, to the following
        * address:
        *
        *     Pearson Education, Inc.
        *     Rights and Permissions Department
        *     One Lake Street
        *     Upper Saddle River, NJ  07458
        *     Fax: (201) 236-3290
        */

        /* This file defines the Sales_item class used in chapter 1.
        * The code used in this file will be explained in
        * Chapter 7 (Classes) and Chapter 14 (Overloaded Operators)
        * Readers shouldn't try to understand the code in this file
        * until they have read those chapters.
        */

        #ifndef SALESITEM_H
        // we're here only if SALESITEM_H has not yet been defined
        #define SALESITEM_H

        #include "Version_test.h"

        // Definition of Sales_item class and related functions goes here
        #include <iostream>
        #include <string>

        class Sales_item {
         // these declarations are explained section 7.2.1, p. 270
         // and in chapter 14, pages 557, 558, 561
         friend std::istream& operator>>(std::istream&, Sales_item&);
         friend std::ostream& operator<<(std::ostream&, const Sales_item&);
         friend bool operator<(const Sales_item&, const Sales_item&);
         friend bool
          operator==(const Sales_item&, const Sales_item&);
        public:
         // constructors are explained in section 7.1.4, pages 262 - 265
         // default constructor needed to initialize members of built-in type
        #if defined(IN_CLASS_INITS) && defined(DEFAULT_FCNS)
         Sales_item() = default;
        #else
         Sales_item() : units_sold(0), revenue(0.0) { }
        #endif
         Sales_item(const std::string &book) :
          bookNo(book), units_sold(0), revenue(0.0) { }
         Sales_item(std::istream &is) { is >> *this; }
        public:
         // operations on Sales_item objects
         // member binary operator: left-hand operand bound to implicit this pointer
         Sales_item& operator+=(const Sales_item&);

         // operations on Sales_item objects
         std::string isbn() const { return bookNo; }
         double avg_price() const;
         // private members as before
        private:
         std::string bookNo;      // implicitly initialized to the empty string
        #ifdef IN_CLASS_INITS
         unsigned units_sold = 0; // explicitly initialized
         double revenue = 0.0;
        #else
         unsigned units_sold;
         double revenue;
        #endif
        };

        // used in chapter 10
        inline
        bool compareIsbn(const Sales_item &lhs, const Sales_item &rhs)
        {
         return lhs.isbn() == rhs.isbn();
        }

        // nonmember binary operator: must declare a parameter for each operand
        Sales_item operator+(const Sales_item&, const Sales_item&);

        inline bool
        operator==(const Sales_item &lhs, const Sales_item &rhs)
        {
         // must be made a friend of Sales_item
         return lhs.units_sold == rhs.units_sold &&
          lhs.revenue == rhs.revenue &&
          lhs.isbn() == rhs.isbn();
        }

        inline bool
        operator!=(const Sales_item &lhs, const Sales_item &rhs)
        {
         return !(lhs == rhs); // != defined in terms of operator==
        }

        // assumes that both objects refer to the same ISBN
        Sales_item& Sales_item::operator+=(const Sales_item& rhs)
        {
         units_sold += rhs.units_sold;
         revenue += rhs.revenue;
         return *this;
        }

        // assumes that both objects refer to the same ISBN
        Sales_item
        operator+(const Sales_item& lhs, const Sales_item& rhs)
        {
         Sales_item ret(lhs);  // copy (|lhs|) into a local object that we'll return
         ret += rhs;           // add in the contents of (|rhs|)
         return ret;           // return (|ret|) by value
        }

        std::istream&
        operator>>(std::istream& in, Sales_item& s)
        {
         double price;
         in >> s.bookNo >> s.units_sold >> price;
         // check that the inputs succeeded
         if (in)
          s.revenue = s.units_sold * price;
         else
          s = Sales_item();  // input failed: reset object to default state
         return in;
        }

        std::ostream&
        operator<<(std::ostream& out, const Sales_item& s)
        {
         out << s.isbn() << " " << s.units_sold << " "
          << s.revenue << " " << s.avg_price();
         return out;
        }

        double Sales_item::avg_price() const
        {
         if (units_sold)
          return revenue / units_sold;
         else
          return 0;
        }
        #endif


    // THE VERSION_TEST.H CODE:

        #pragma once

        /*
        * This file contains code from "C++ Primer, Fifth Edition", by Stanley B.
        * Lippman, Josee Lajoie, and Barbara E. Moo, and is covered under the
        * copyright and warranty notices given in that book:
        *
        * "Copyright (c) 2013 by Objectwrite, Inc., Josee Lajoie, and Barbara E. Moo."
        *
        *
        * "The authors and publisher have taken care in the preparation of this book,
        * but make no expressed or implied warranty of any kind and assume no
        * responsibility for errors or omissions. No liability is assumed for
        * incidental or consequential damages in connection with or arising out of the
        * use of the information or programs contained herein."
        *
        * Permission is granted for this code to be used for educational purposes in
        * association with the book, given proper citation if and when posted or
        * reproduced. Any commercial use of this code requires the explicit written
        * permission of the publisher, Addison-Wesley Professional, a division of
        * Pearson Education, Inc. Send your request for permission, stating clearly
        * what code you would like to use, and in what specific way, to the following
        * address:
        *
        *  Pearson Education, Inc.
        *  Rights and Permissions Department
        *  One Lake Street
        *  Upper Saddle River, NJ  07458
        *  Fax: (201) 236-3290
        */

        #ifndef VERSION_TEST_H
        #define VERSION_TEST_H

        /* As of the first printing of C++ Primer, 5th Edition (July 2012),
        * the Microsoft Complier did not yet support a number of C++ 11 features.
        *
        * The code we distribute contains both normal C++ code and
        * workarounds for missing features.  We use a series of CPP variables to
        * determine whether a given features is implemented in a given release
        * of the MS compiler.  The base version we used to test the code in the book
        * is Compiler Version 17.00.50522.1 for x86.
        *
        * When new releases are available we will update this file which will
        * #define the features implemented in that release.
        */

        #if _MSC_FULL_VER == 170050522 || _MSC_FULL_VER == 170050727
        // base version, future releases will #define those features as they are
        // implemented by Microsoft

        /* Code in this delivery use the following variables to control compilation

        Variable tests           C++ 11 Feature
        CONSTEXPR_VARS            constexpr variables
        CONSTEXPR_FCNS            constexpr functions
        CONSTEXPR_CTORS           constexpr constructors and other member functions
        DEFAULT_FCNS              = default
        DELETED_FCNS              = delete
        FUNC_CPP                  __func__ local static
        FUNCTION_PTRMEM           function template with pointer to member function
        IN_CLASS_INITS            in class initializers
        INITIALIZER_LIST          library initializer_list<T> template
        LIST_INIT                 list initialization of ordinary variables
        LROUND                    lround function in cmath
        NOEXCEPT                  noexcept specifier and noexcept operator
        SIZEOF_MEMBER             sizeof class_name::member_name
        TEMPLATE_FCN_DEFAULT_ARGS default template arguments for function templates
        TYPE_ALIAS_DECLS          type alias declarations
        UNION_CLASS_MEMS          unions members that have constructors or copy control
        VARIADICS                 variadic templates
        */
        #endif  // ends compiler version check

        #ifndef LROUND
        inline long lround(double d)
        {
         return (d >= 0) ? long(d + 0.5) : long(d - 0.5);
        }
        #endif

        #endif  // ends header guard

                                                                                                                                                                                      

    • Edited by evan chime Friday, November 13, 2015 6:49 PM
    • Moved by litdev Friday, November 13, 2015 7:58 PM
    Friday, November 13, 2015 6:42 PM

Answers

  • Hi evan chime,

    In C++ Programming Lanugage #include <iostream> is the first thing you must add in your source.cpp file in order to read or write to the standard input/output streams of your App you need to include it.

    After you include "iostream" in your file you can include other header files and libraries.

    Best regards!
    (If this was helpful for you please, propose it as an answer.)
    • Proposed as answer by Almir VukMVP Friday, November 13, 2015 7:08 PM
    • Marked as answer by evan chime Tuesday, November 24, 2015 4:06 PM
    Friday, November 13, 2015 7:08 PM
  • The compiler error messages point to version_test.h and specifically to a redefinition in that header file of a function named lround.  The lround definition in version_test.h is bracketed by preprocessor directives so that it is conditionally included in the compilation.  The version_test.h header is #included within sales_test.h.  It seems likely that when the order of the headers is changed, the redefinition of lround does or does not happen based on the conditional compilation preprocessor directives.
    • Proposed as answer by chchlll Tuesday, November 24, 2015 2:35 AM
    • Marked as answer by Shu 2017 Tuesday, November 24, 2015 3:12 AM
    Friday, November 13, 2015 9:53 PM

All replies

  • What programming language is this?  This forum is about the Small Basic language, you should look for another forum.

    Jan [ WhTurner ] The Netherlands

    Friday, November 13, 2015 6:49 PM
  • Hi evan chime,

    In C++ Programming Lanugage #include <iostream> is the first thing you must add in your source.cpp file in order to read or write to the standard input/output streams of your App you need to include it.

    After you include "iostream" in your file you can include other header files and libraries.

    Best regards!
    (If this was helpful for you please, propose it as an answer.)
    • Proposed as answer by Almir VukMVP Friday, November 13, 2015 7:08 PM
    • Marked as answer by evan chime Tuesday, November 24, 2015 4:06 PM
    Friday, November 13, 2015 7:08 PM
  • The compiler error messages point to version_test.h and specifically to a redefinition in that header file of a function named lround.  The lround definition in version_test.h is bracketed by preprocessor directives so that it is conditionally included in the compilation.  The version_test.h header is #included within sales_test.h.  It seems likely that when the order of the headers is changed, the redefinition of lround does or does not happen based on the conditional compilation preprocessor directives.
    • Proposed as answer by chchlll Tuesday, November 24, 2015 2:35 AM
    • Marked as answer by Shu 2017 Tuesday, November 24, 2015 3:12 AM
    Friday, November 13, 2015 9:53 PM
  • cheers
    Tuesday, November 24, 2015 4:05 PM
  • cheers

    Tuesday, November 24, 2015 4:05 PM