Introduction
This code was written after searching the Internet to no avail for a fully functional Microsoft C and C++ implementation of getopt
, getopt_long
, and getopt_long_only
which would work in both Unicode and Multibyte builds.
It is a modification of the Free Software Foundation, Inc. getopt
library for parsing command line arguments and the purpose is to provide a Microsoft Visual C friendly derivative. This code provides functionality for both Unicode and Multibyte builds and supports getopt
, getopt_long
, and getopt_long_only
and the POSIXLY_CORRECT
environment flag. The library uses standard Microsoft C typedef
s for char
and wchar_t
via the _UNICODE
preprocessor directive.
The original GNU code used several header and implementation files containing numerous preprocessor directives specific to Linux environments which have been removed. After removing unneeded dependencies, it was condensed into a single header and implementation file which could be added to any Visual C, C++, or MFC project. For the sake of brevity, this article doesn't discuss how to use the getopt
functions. Anyone new to using the getopt
functions should refer to the GNU tutorial for using getopt
. Since getopt
is licensed under LGPL, it is free to use in proprietary software.
Sample Code Provided
To help with understanding how to use the code, many versions have been provided for download. The following downloads are provided:
- Visual Studio .NET 2008 ANSI Project
- Visual Studio .NET 2005 ANSI Project
- Visual Studio .NET 2005 MFC Project
- Visual Studio 6 ANSI Project
- Visual Studio 6 MFC Project
Using the Code
The code is used identical to GNU getopt
.
#include <stdio.h>
#include <stdlib.h>
#include "getopt.h"
int _tmain(int argc, TCHAR** argv)
{
static int verbose_flag;
int c;
while (1)
{
static struct option long_options[] =
{
{_T("verbose"), ARG_NONE, &verbose_flag, 1},
{_T("brief"), ARG_NONE, &verbose_flag, 0},
{_T("add"), ARG_NONE, 0, _T('a')},
{_T("append"), ARG_NONE, 0, _T('b')},
{_T("delete"), ARG_REQ, 0, _T('d')},
{_T("create"), ARG_REQ, 0, _T('c')},
{_T("file"), ARG_REQ, 0 , _T('f')},
{ ARG_NULL , ARG_NULL , ARG_NULL , ARG_NULL }
};
int option_index = 0;
c = getopt_long(argc, argv, _T("abc:d:f:"), long_options, &option_index);
if (c == -1)
break;
switch (c)
{
case 0:
if (long_options[option_index].flag != 0)
break;
_tprintf (_T("option %s"), long_options[option_index].name);
if (optarg)
_tprintf (_T(" with arg %s"), optarg);
_tprintf (_T("\n"));
break;
case _T('a'):
_tprintf(_T("option -a\n"));
break;
case _T('b'):
_tprintf(_T("option -b\n"));
break;
case _T('c'):
_tprintf (_T("option -c with value `%s'\n"), optarg);
break;
case _T('d'):
_tprintf (_T("option -d with value `%s'\n"), optarg);
break;
case _T('f'):
_tprintf (_T("option -f with value `%s'\n"), optarg);
break;
case '?':
break;
default:
abort();
}
}
if (verbose_flag)
_tprintf (_T("verbose flag is set\n"));
if (optind < argc)
{
_tprintf (_T("non-option ARGV-elements: "));
while (optind < argc) _tprintf (_T("%s "), argv[optind++]);
_tprintf (_T("\n"));
}
return 0;
}
Using this Code with C++ Precompiled Headers
When using this code in a C++ project with precompiled headers, it is necessary to rename getopt.c to getopt.cpp in order to circumvent the following compiler error:
"C1853 - Precompiled header file is from a previous version of the compiler,
or the precompiled header is C++ and you are using it from C (or vice versa)."
Additionally precompiled header file must be added as the first include of the getopt.c or getopt.cpp file. For example, if you are using "stdafx.h" as the precompiled header, the following would be expected:
#include "stdafx.h"
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include "getopt.h"
History
- 02/03/2011 - Initial release
- 02/20/2011 - Fixed L4 compiler warnings
- 07/05/2011 - Added
no_argument
, required_argument
, optional_argument
def - 08/05/2011 - Fixed non-argument runtime bug which caused runtime exception
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.