0

以下のコードは以前はCでしたが、Visual Studio2008でc++プログラムとして記述し、正常に動作します(C ++として保存されます)。しかし、プログラムはCコードですよね?(またはそれは?)。

そのため、Visual Studio内でCとしてコンパイルしようとすると([移動]->[ファイルのプロパティ]->[c / c ++]->[詳細設定]->[名前を付けてコンパイル]->[Cコードとしてコンパイル]に変更)、多くのエラーが発生します、そのメインはLPSTRタイプを認識しません。だから、私の質問は次のとおりだと思います:それはCまたはC ++コードですか?それがCの場合、Cコードをコンパイルするように変更したときになぜ機能しなかったのですか?

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <strsafe.h>
#include <direct.h>
#include <string.h>
#include <conio.h>

int main(VOID)
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    //allocate memory
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));


    //create child process
    if (!CreateProcess(NULL,
                L"C:\\Windows\\Notepad.exe",
                NULL,
                NULL,
                FALSE,
                0,
                NULL,
                NULL,
                &si,
                &pi))
    {
        fprintf(stderr, "create process failed");

        return -1;
    }

    //parent waits for child to complete
    WaitForSingleObject(pi.hProcess, INFINITE);

    printf("Child Complete");

    //close handle
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hthread);

}  
4

4 に答える 4

6

C としてきれいにコンパイルされますCloseHandle(pi.hthread)のメンバーではないため、唯一のエラーは によって引き起こされPROCESS_INFORMATIONます。hThread(大文字の T)を探しています。

于 2012-04-07T12:14:39.207 に答える
1

それは C です。しかし、ほとんどの C++ コンパイラは C コードをコンパイルできます。ヘッダーconio.hは標準 C の一部ではないため、回避することをお勧めします。

LPSTRはwindows.hで定義されており、それを含めたので、エラーは発生しません。それは型定義されています:

typedef char* PSTR, *LPSTR; 

コード内の他の typedef 変数については、ヘッダーかどうかを確認する必要があります。含めてみてくださいWinbase.h

于 2012-04-07T12:19:36.543 に答える
0

非標準のヘッダーとマクロを使用しているため、提供された内容から、それが有効なCであるかどうかを確認することはできません。しかし、これをCコードに変換するマクロ定義が存在する可能性があることは想像できます。

Cの場合、それはあまり良くありませんし、C++にとってもあまり良くありません。どちらの言語にも変数を初期化する方法がありますが、コードはそれらを使用していません。特にC(およびC ++のPOD)には、変数を初期化するための初期化子があります。ここで両方の醜いマクロがタイプに展開されると仮定します。

STARTUPINFO si = { 0 };
PROCESS_INFORMATION pi = { 0 };

あなたがC99準拠のコンパイラを持っているなら、最初のものはさらに良いでしょう

STARTUPINFO si = { .cb = sizeof si };

何らかの理由でメモリのブロック全体をゼロにする関数が必要な場合は、そのための標準関数memsetを使用することをお勧めします。ただし、Cで正しい初期化子(またはC ++でコンストラクター)を使用する場合、それが明示的に必要になることはめったにありません。

于 2012-04-07T15:42:14.207 に答える
-7

すべてのcコードは有効なc++コードです。しかし、その逆ではありません。したがって、c++であるOSAPIを使用する場合は、c++としてコンパイルする必要があります。

于 2012-04-07T12:13:12.513 に答える