error C2275 : illegal use of this type as an expression
Solution 1:
When you name your source files *.c
, MSVC assumes it's compiling C, which means C89. All block-local variables need to be declared at the beginning of the block.
Workarounds include:
- declaring/initializing all local variables at the beginning of a code block (directly after an opening brace
{
) - rename the source files to
*.cpp
or equivalent and compile as C++. - upgrading to VS 2013, which relaxes this restriction.
Solution 2:
You might be using a version of C that doesn't allow variables to be declared in the middle of a block. C used to require that variables be declared at the top of a block, after the opening { and before executable statements.
Solution 3:
Put braces around the code where the variable is used.
In your case that means:
if (ac > 1)
{
if (!parse_args(ac, av))
{
aff_error(ARGUMENTS);
return EXIT_FAILURE;
}
}
{
SERVICE_TABLE_ENTRY DispatchTable[] = {{MY_SERVICE_NAME, ServiceMain}, {NULL, NULL}};
StartServiceCtrlDispatcher(DispatchTable);
}
Solution 4:
This error occurred when transferring a project from one installation to another (VS2015 => VS2010).
The C code was actually compiled as C++ on the original machine, on the target machine the "Default" setting in Project Properties\C/C++\Advanced\Compile as
was somehow pointing to C even though the source file was of type *.cpp.
In my small program, errors popped up regarding the placement in code of certain types e.g. HWND
and HRESULT
as well as on the different format of for
loops , and C++ constructs like LPCTSTR,
size_t
, StringCbPrintf
and BOOL
. Comparison.
Changing the "Compile as" from Default
to Compile as C++ Code (/TP)
resolved it.