/////// FIle objopt.C /////// #include #include class Option { public: Option(); // extract options from argc and argv void extract(int &argc, char *argv[]); // option flags int objfile_only; // produce .o files only, = 0 char* ofile_name; // output filename = "a.out" int unknown_option; // error flag = 0 /* ... */ }; Option::Option() { objfile_only = 0; ofile_name = "a.out"; unknown_option = 0; } void Option::extract(int &argc, char *argv[]) { char *token = argv[1]; int arg_cnt = 0; // true args count // go through each command-line arg for (int i = 1 ; i < argc ; token = argv[++i]) { if ( token[0] == '-') // if token an option for(int k = 1 ; token[k] != '\0' ; k++) // option processing { switch (token[k]) { case 'c': objfile_only = 1; break; // turn on flag case 'o': if ( i < argc - 1 ) ofile_name = argv[++i]; // output filename break; /* ... */ default: cerr << argv[0] << ": " << token[k] << " unknown option\n"; unknown_option = 1; // error flag } // end of switch } else // token not an option argv[++arg_cnt] = token; // coalescing other args } // end of outer for argc = arg_cnt + 1; // modified argc argv[argc] = NULL; // end marker } Option g_opt; // global option object int main(int argc, char *argv[]) { cout << g_opt.ofile_name << "\n"; g_opt.extract(argc, argv); if ( g_opt.unknown_option ) exit(1); for (int i=0; i < argc; i++) cout << argv[i] << " "; cout << "\n"; cout << g_opt.ofile_name << "\n"; }