CS253: Software Development with C++

Fall 2018

Implicit Inclusion

See this page as a slide show

CS253 Implicit Inclusion

Dubious Code

Is this code correct?

#include <iostream>

using namespace std;

int main() {
    string s = "Han shot first!\n";
    cout << s;
}
Han shot first!

Bad Code

#include <iostream>

using namespace std;

int main() {
    string s = "Han shot first!\n";
    cout << s;
}
Han shot first!

The code is not correct. A std::string was defined, but there is no #include <string>. But, still, it compiled. ☺? ☹?

Not a Cause for Celebration

operator<<

Light Dawns

#include <iostream>

using namespace std;

int main() {
    string s = "Han shot first!\n";
    cout << s;
}
Han shot first!

This Could Happen

One could construct <iostream> & <string> so they don’t #include each other:

<iostream-string-overloads>:
    std::ostream &operator<<(std::ostream &, const std::string &);

<iostream>:
    #define IOSTREAM_INCLUDED
    #ifdef STRING_INCLUDED
	#include <iostream-string-overloads>
    #endif

<string>:
    #define STRING_INCLUDED
    #ifdef IOSTREAM_INCLUDED
	#include <iostream-string-overloads>
    #endif

Solution

#include <iostream>
#include <string>

using namespace std;

int main() {
    string s = "Han shot first!\n";
    cout << s;
}
Han shot first!

Theoretical

Example

Consider this program, compiled on my Macbook Air under macOS:

    % cat c.cc
    #include <cmath>
    int main() {
        return isinf(0.0);
    }
    % g++ c.cc
    % ./a.out
    % g++ --version
    Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
    Apple LLVM version 8.0.0 (clang-800.0.42.1)
    Target: x86_64-apple-darwin15.6.0
    Thread model: posix
    InstalledDir: /Library/Developer/CommandLineTools/usr/bin

Example

The same program, compiled on a CSU CS Department computer:

    % cat c.cc
    #include <cmath>
    int main() {
        return isinf(0.0);
    }
    % g++ c.cc
    c.cc: In function ‘int main()’:
    c.cc:3:12: error: ‘isinf’ was not declared in this scope
         return isinf(0.0);
        	^~~~~
    c.cc:3:12: note: suggested alternative:
    In file included from c.cc:1:0:
    /usr/include/c++/7/cmath:612:5: note:   ‘std::isinf’
         isinf(_Tp __x)
         ^~~~~
    % g++ --version
    g++ (GCC) 7.3.1 20180130 (Red Hat 7.3.1-2)

Conclusion

TEST ON THE TARGET MACHINE

User: Guest

Check: HTML CSS
Edit History Source

Modified: 2018-10-17T13:53

Apply to CSU | Contact CSU | Disclaimer | Equal Opportunity
Colorado State University, Fort Collins, CO 80523 USA
© 2018 Colorado State University
CS Building