CS253: Software Development with C++

Spring 2020

Symbol Ambiguity

Show Lecture.SymbolAmbiguity as a slide show.

CS253 Symbol Ambiguity

or

“Them there namespacies is trickier then I done thought!”

The __cplusplus symbol

% cp ~/Example/version.cc .
% cat version.cc
#include <iostream>
int main() {
    std::cout << __cplusplus << '\n';
}

% g++ -std=c++98 -Wall version.cc && ./a.out
199711

% g++ -std=c++11 -Wall version.cc && ./a.out
201103

using namespace, C++ 98

#include <iostream>
#include <string>
#include <utility>

using namespace std;

void move(const string &s) {
    cout << "moving " << s << '\n';
}

int main() {
    cout << __cplusplus << '\n';
    move("umbrella");
}
199711
moving umbrella

using namespace, C++ 11

#include <iostream>
#include <string>
#include <utility>

using namespace std;

void move(const string &s) {
    cout << "moving " << s << '\n';
}

int main() {
    cout << __cplusplus << '\n';
    move("umbrella");
}
201103

using namespace, C++ 11

#include <iostream>
#include <string>
#include <utility>

using namespace std;

void move(const string &s) {
    cout << "moving " << s << '\n';
}

int main() {
    cout << __cplusplus << '\n';
    move("umbrella");
}
201103

Explicit std::, C++ 98

#include <iostream>
#include <string>
#include <utility>

void move(const std::string &s) {
    std::cout << "moving " << s << '\n';
}

int main() {
    std::cout << __cplusplus << '\n';
    move("umbrella");
}
199711
moving umbrella

Explicit std::, C++ 11

#include <iostream>
#include <string>
#include <utility>

void move(const std::string &s) {
    std::cout << "moving " << s << '\n';
}

int main() {
    std::cout << __cplusplus << '\n';
    move("umbrella");
}
201103
moving umbrella

Selective using, C++ 98

#include <iostream>
#include <string>
#include <utility>

using std::string;
using std::cout;

void move(const string &s) {
    cout << "moving " << s << '\n';
}

int main() {
    cout << __cplusplus << '\n';
    move("umbrella");
}
199711
moving umbrella

Selective using, C++ 11

#include <iostream>
#include <string>
#include <utility>

using std::string;
using std::cout;

void move(const string &s) {
    cout << "moving " << s << '\n';
}

int main() {
    cout << __cplusplus << '\n';
    move("umbrella");
}
201103
moving umbrella

☼☂⛅☁☔

Do you carry an umbrella every day, or only when the weather report predicts rain?

If you carry an umbrella every day, then you’re always dry, but you have the bother of carrying an umbrella all the time.

If you only carry it when rain is predicted, then you’ll get wet once in a while. However, you don’t have to lug around an umbrella when you don’t need it.

It’s a trade-off. Which price do you want to pay? Constant carrying, or occasional moisture?

Trade-offs

Similarly …

    
cout << setw(5) << setfill('*') << hex << 42 << endl;
std::cout << std::setw(5) << std::setfill('*') << std::hex << 42 << std::endl;
***2a
***2a
    #include <iostream>
    using std::cin;
    using std::cout;
    using std::getline;
    using namespace std;

Trade-offs

Your choice! My opinions: