CS253: Software Development with C++

Spring 2023

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

% cat ~cs253/Example/version.cc
#include <iostream>
int main() {
    std::cout << __cplusplus << '\n';
}
% g++ -std=c++98 -Wall ~cs253/Example/version.cc && ./a.out
199711
% g++ -std=c++11 -Wall ~cs253/Example/version.cc && ./a.out
201103
% g++ -std=c++14 -Wall ~cs253/Example/version.cc && ./a.out
201402
% g++ -std=c++17 -Wall ~cs253/Example/version.cc && ./a.out
201703

What version do we use?

It’s easy to tell which version of the standard is in use:

cout << __cplusplus / 100;
2017

using namespace, C++ 14

#include <algorithm>
#include <iostream>
using namespace std;

void blamp(long w, long h, long d) {
    cout << "Type-B lamp, volume=" << w*h*d << '\n';
}

void clamp(long w, long h, long d) {
    cout << "Type-C lamp, volume=" << w*h*d << '\n';
}

int main() {
    blamp(5, 6, 7);
    clamp(5, 6, 7);
}
Type-B lamp, volume=210
Type-C lamp, volume=210

Rock-solid code. That’ll work forever!

using namespace, C++ 17

#include <algorithm>
#include <iostream>
using namespace std;

void blamp(long w, long h, long d) {
    cout << "Type-B lamp, volume=" << w*h*d << '\n';
}

void clamp(long w, long h, long d) {
    cout << "Type-C lamp, volume=" << w*h*d << '\n';
}

int main() {
    blamp(5, 6, 7);
    clamp(5, 6, 7);
}
Type-B lamp, volume=210
Only changed -std=c++14 to -std=c++17, but the output changed! Why?

The function clamp() was introduced in C++17. It’s a better match for a three int arguments than a function that takes three long arguments.

using namespace, C++ 17

#include <algorithm>
#include <iostream>
using namespace std;

void blamp(long w, long h, long d) {
    cout << "Type-B lamp, volume=" << w*h*d << '\n';
}

void clamp(long w, long h, long d) {
    cout << "Type-C lamp, volume=" << w*h*d << '\n';
}

int main() {
    blamp(5, 6, 7);
    clamp(5, 6, 7);
}
Type-B lamp, volume=210

Explicit std::, C++ 14

#include <algorithm>
#include <iostream>

void blamp(long w, long h, long d) {
    std::cout << "Type-B lamp, volume=" << w*h*d << '\n';
}

void clamp(long w, long h, long d) {
    std::cout << "Type-C lamp, volume=" << w*h*d << '\n';
}

int main() {
    blamp(5, 6, 7);
    clamp(5, 6, 7);
}
Type-B lamp, volume=210
Type-C lamp, volume=210

Explicit std::, C++ 17

#include <algorithm>
#include <iostream>

void blamp(long w, long h, long d) {
    std::cout << "Type-B lamp, volume=" << w*h*d << '\n';
}

void clamp(long w, long h, long d) {
    std::cout << "Type-C lamp, volume=" << w*h*d << '\n';
}

int main() {
    blamp(5, 6, 7);
    clamp(5, 6, 7);
}
Type-B lamp, volume=210
Type-C lamp, volume=210

Selective using, C++ 14

#include <algorithm>
#include <iostream>
using std::cout;

void blamp(long w, long h, long d) {
    cout << "Type-B lamp, volume=" << w*h*d << '\n';
}

void clamp(long w, long h, long d) {
    cout << "Type-C lamp, volume=" << w*h*d << '\n';
}

int main() {
    blamp(5, 6, 7);
    clamp(5, 6, 7);
}
Type-B lamp, volume=210
Type-C lamp, volume=210

Selective using, C++ 17

#include <algorithm>
#include <iostream>
using std::cout;

void blamp(long w, long h, long d) {
    cout << "Type-B lamp, volume=" << w*h*d << '\n';
}

void clamp(long w, long h, long d) {
    cout << "Type-C lamp, volume=" << w*h*d << '\n';
}

int main() {
    blamp(5, 6, 7);
    clamp(5, 6, 7);
}
Type-B lamp, volume=210
Type-C lamp, volume=210

☼️ ☂️ ⛅️ ☁️ ☔️

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? Both have a cost.

Trade-offs

std::cout << std::setw(5)
          << std::setfill('*')
          << std::hex
          << 42
          << std::endl;
***2a

Similarly …

#include <iostream>
using std::cin,
      std::cout,
      std::getline;
using namespace std;

Trade-offs

Your choice! My opinions:

a picture of Prof. Bruce Draper
Prof. Bruce Draper