Cpp Notes

CPL

CPL: C-style programming

  • C and C++ are closely related languages. They both originate in "Classic C" from 1978 and have evolved in ISO committees since then.
  • Many attempts have been made to keep them compatible, but neither is a subset of the other.

CPL.1: Prefer C++ to C

  • C++ provides better type checking and more notational support.
  • It provides better support for high-level programming and often generates faster code.
char ch = 7;
void* pv = &ch;
int* pi = pv;   // not C++
*pi = 999;      // overwrite sizeof(int) bytes near &ch
  • The rules for implicit casting to and from void* in C are subtle and unenforced. In particular, this example violates a rule against converting to a type with stricter alignment.

CPL.2: If you must use C, use the common subset of C and C++, and compile the C code as C++

  • That subset can be compiled with both C and C++ compilers, and when compiled as C++ is better type checked than "pure C."
int* p1 = malloc(10 * sizeof(int));                      // not C++
int* p2 = static_cast<int*>(malloc(10 * sizeof(int)));   // not C, C-style C++
int* p3 = new int[10];                                   // not C
int* p4 = (int*) malloc(10 * sizeof(int));               // both C and C++
  • The C++ compiler will enforce that the code is valid C++ unless you use C extension options.

CPL.3: If you must use C for interfaces, use C++ in the calling code using such interfaces

  • C++ is more expressive than C and offers better support for many types of programming.

  • For example, to use a 3rd party C library or C systems interface

    • define the low-level interface in the common subset of C and C++ for better type checking.
    • Whenever possible encapsulate the low-level interface in an interface that follows the C++ guidelines (for better abstraction, memory safety, and resource safety) and use that C++ interface in C++ code.
  • Example: You can call C from C++:

// in C:
double sqrt(double);

// in C++:
extern "C" double sqrt(double);

sqrt(2);
  • Example: You can call C++ from C:
// in C:
X call_f(struct Y*, int);

// in C++:
extern "C" X call_f(Y* p, int i) {
    return p->f(i); // possibly a virtual function call
}