web-dev-qa-db-ja.com

エラーC2275:この型の式としての不正な使用

昨日から、Cプロジェクトのコンパイルエラーに直面しています。プロジェクト自体は、いくつかのタスクを実行するサービスの作成で構成されています。

昨日から変わったことはありませんが、今朝、私のコードはもうコンパイルできません。

ここに私が持っているエラーがあります:

c:\path\main.c(56): error C2275: 'SERVICE_TABLE_ENTRY' : illegal use of this type as an expression
c:\program files\Microsoft sdks\windows\v7.0a\include\winsvc.h(773) : see declaration of 'SERVICE_TABLE_ENTRY'
c:\path\main.c(56): error C2146: syntax error : missing ';' before identifier 'DispatchTable'
c:\path\main.c(56): error C2065: 'DispatchTable' : undeclared identifier
c:\path\main.c(56): error C2059: syntax error : ']'
c:\path\main.c(57): error C2065: 'DispatchTable' : undeclared identifier
c:\path\main.c(57): warning C4047: 'function' : 'const SERVICE_TABLE_ENTRYA *' differs in levels of indirection from 'int'
c:\path\main.c(57): warning C4024: 'StartServiceCtrlDispatcherA' : different types for formal and actual parameter 1

これらのエラーに関係するコードは次のとおりです(45行目から58行目まで)。

int main(int ac, char *av[])
{
    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);
    return EXIT_SUCCESS;
}

そして、これが私のServiceMain関数のコードです:

void WINAPI ServiceMain(DWORD ac, LPTSTR *av)
{
    gl_ServiceStatus.dwServiceType = SERVICE_WIN32;
    gl_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
    gl_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
    gl_ServiceStatus.dwWin32ExitCode = 0;
    gl_ServiceStatus.dwServiceSpecificExitCode = 0;
    gl_ServiceStatus.dwCheckPoint = 0;
    gl_ServiceStatus.dwWaitHint = 0;
    gl_ServiceStatusHandle = RegisterServiceCtrlHandler(MY_SERVICE_NAME, ServiceCtrlHandler);
    if (gl_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
        return;
    gl_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
    gl_ServiceStatus.dwCheckPoint = 0;
    gl_ServiceStatus.dwWaitHint = 0;
    SetServiceStatus(gl_ServiceStatusHandle, &gl_ServiceStatus);
}

私の問題に合った答えを見つけることができませんでした。ありがとう!

54
Nugget

ソースファイルに*.cという名前を付けると、MSVCはCのコンパイル、つまりC89をコンパイルしていると想定します。すべてのブロックローカル変数は、ブロックの先頭で宣言する必要があります。

回避策は次のとおりです。

  • コードブロックの先頭(開始中括弧{の直後)ですべてのローカル変数を宣言/初期化する
  • ソースファイルの名前を*.cppまたは同等のものに変更し、C++としてコンパイルします。
  • vS 2013にアップグレードすると、 この制限が緩和されます
135
rubenvb

ブロックの途中で変数を宣言できないバージョンのCを使用している可能性があります。 Cは、変数をブロックの先頭、開始後{および実行可能ステートメントの前に宣言することを要求していました。

7

このエラーは、あるインストールから別のインストールにプロジェクトを転送するときに発生しました(VS2015 => VS2010)。
Cコードは、元のマシンで実際にC++としてコンパイルされました。ターゲットマシンでは、ソースファイルのタイプが* .cppであっても、_Project Properties\C/C++\Advanced\Compile as_の「デフォルト」設定が何らかの形でCを指していました。
私の小さなプログラムでは、特定のタイプのコードの配置に関するエラーがポップアップしました。 HWNDおよびHRESULT、およびforループの異なる形式、および_LPCTSTR,_ _size_t_、StringCbPrintfなどのC++構成体およびBOOL比較
「コンパイル」をDefaultからCompile as C++ Code (/TP)に変更すると解決しました。

2
Laurie Stearn

変数が使用されるコードを中括弧で囲みます。

あなたの場合、それは次のことを意味します:

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);
}
2
user1130406

これにより、「このタイプを式として違法に使用する」こともできます。

間違った:

MyClass::MyClass()
{
   *MyClass _self = this;
}

修正:

MyClass::MyClass()
{
   MyClass* _self = this;
}

あなたはそのコードのポイントを疑問に思うかもしれません。コンパイラーがエラーをスローしたときに、明示的に型にキャストすることで、「this」を別のオブジェクトのコンストラクターに送信しようとしたときに、クラス名の前にあるハンガリー語表記を無視していることに気付きました。バグハンティングを行う場合は、すべての前提条件をテストするのが最善です。

0
J.M.I. MADISON