2012-04-07 5 views
0

私は以下のコードがCであったことを知っていますが、Visual Studio 2008でC++プログラムとして書いてあり、うまくいきます(C++として保存されています)。しかし、プログラムはCコードで、正しいですか? (またはそれは?)。コードCまたはC++はありますか?

私はVisual Studio内でコンパイルしようとしたときに(ファイルのプロパティ - > 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); 

} 
+0

CまたはC++であるかどうかを確かめる方法の1つは、ペタンティックフラグをオンにしてCまたはC++コンパイラでコンパイルすることです。これにより、非標準のCまたはC++をコンパイルできるようにするコンパイラの拡張やその他のコンパイラの不規則性が排除されます。 – mydogisbox

答えて

-7

すべてのCコードは有効なC++コードです。それ以外の方法ではありません。ですから、OSのapiをC++としたいのであれば、それをC++としてコンパイルするべきです。

+10

完全に真実ではありません。 C++にはCが持たない追加のキーワードがあり、Cコードではそれらのキーワードを正当な変数名として使用できます。他にも違いがあります:http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B – DCoder

+0

これは私が言ったことです。 C++はcの「スーパーセット」です。これは、cコードもC++コードであることを意味します。しかし、C++コードは必ずしもCコードではありません。 – Aftnix

+2

いいえ、C++はCの厳密なスーパーセットではありません。あなたが与えたリンクのように。 – DCoder

6

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

1

それはCですが、ほとんどのC++コンパイラはCコードをコンパイルすることができます。ヘッダーconio.hは標準Cの一部ではありませんので、避けたいかもしれません。

LPSTRはwindows.hで定義されています。あなたがそれを含んでいたので、何もエラーがあってはいけません。

typedef char* PSTR, *LPSTR; 

コード内の他のtypedef'ed変数については、ヘッダーがあるかどうかをチェックする必要があります。試してみてくださいWinbase.h

+1

標準Cの' windows.h'部分もありませんが、これを避けようとすれば少し複雑になります;) – Voo

+0

確かに(SOコメントのための余分な文字) :) –

0

あなたが与えてくれたものから、非標準のヘッダーとマクロを使用しているため、有効なCであるかどうかわかりません。しかし、私はこれをCコードに変換するマクロ定義があると想像することができます。

これはCですので、それほど良いものではありませんし、C++のものもありません。どちらの言語も変数を初期化する方法はありますが、コードでは変数を使用しません。特にC(およびC++のPODの場合)には、変数を初期化するためのイニシャライザがあります。あなたはC99準拠したコンパイラを持っている場合、何らかの理由であなたがゼロに機能を必要とするだろう場合は、最初はより良い

STARTUPINFO si = { .cb = sizeof si }; 

なりの

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

:こちらを両方醜いマクロは型に拡大したとすると全体のメモリブロックを使い、標準機能のmemsetを使用してください。しかし、Cで正しいイニシャライザ(またはC++のコンストラクタ)を使用する場合は、それを明示的に必要とする必要はほとんどありません。

関連する問題