1: //storage_linkage_main4.cpp 2: //Goes with storage_linkage_aux4.cpp. Compile the two files 3: //separately and link the object files to produce an executable, 4: //but first activate the same numbered comment in each file. 5: //There are three such pairs of numbered comments. 6: //Illustrates the difference in the "default linkage" of global 7: //variables as compared to global constants. 9: #include <iostream> 10: #include <string> 11: using namespace std; 13: int main() 14: { 15: //extern string myName; //1 16: //extern const string myName; //2 17: //extern const string myName; //3 18: cout << endl << myName; 19: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 20: } 22: /* 23: Questions: 24: 1. What happens when comment //1 is activated in both this file and 25: the companion file? 26: 2. What happens when comment //2 is activated in both this file and 27: the companion file? 28: 3. What happens when comment //3 is activated in both this file and 29: the companion file? 32: Answers: 33: 1. The name "Porter Scobey" is output. This is just the "usual" 34: case of a global (and, by default, extern) variable in one 35: file being accessed from another file in the same compilation 36: unit. 37: 2. This time there is a link error because, unlike global variables, 38: global constants are *not* extern by default and thus have internal 39: linkage. This means they are not visible (by default) in any other 40: file. 41: 3. The name "Porter Scobey" is output. This is because we have added 42: the keyword "extern" to the constant definition in the companion 43: file, thus giving it external linkage and making it visible in 44: this file. 45: */