2012-04-07 41 views
0

我知道下面的代碼曾經是C,但是,我把它寫在Visual Studio 2008中作爲一個C++程序,它工作正常(它保存爲C++)。但是,該程序是在C代碼中,對嗎? (或是否?)。因此,當我試圖在Visual Studio中將其編譯爲C(Go to> Properties of file - > c/C++ - > Advanced - > Compile as - >將其更改爲'Compile as C code')然後得到很多錯誤,其中主要不識別LPSTR類型。所以,我想我的問題是:是C或C++代碼,如果它是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++的一種方法是使用C或C++編譯器編輯迂腐標誌。這將消除任何編譯器擴展或其他編譯器違規行爲,這些行爲將允許非標準的C或C++編譯。 – mydogisbox 2012-04-07 12:15:01

回答

-7

每一個c代碼都是一個有效的C++代碼。但它並非相反。所以如果你想使用C++的OS api,那麼你應該把它編譯爲C++。

+10

並非完全如此。 C++有另外的C關鍵字,C代碼可以使用這些關鍵字作爲合法的變量名稱。還有其他的區別:http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B – DCoder 2012-04-07 12:14:16

+0

這就是我所說的。 C++是c的「超集」。這意味着一個c代碼也是一個C++代碼。但是C++代碼並不總是一個c代碼。 – Aftnix 2012-04-07 12:16:07

+2

不,C++不是C的嚴格超集,就像我給你說的鏈接一樣。 – DCoder 2012-04-07 12:17:10

6

它編譯乾淨如C。唯一的錯誤是由CloseHandle(pi.hthread)觸發的,因爲它不是PROCESS_INFORMATION的成員。您正在尋找hThread(大寫字母T)。

1

這是C.但大多數C++編譯器都能夠編譯C代碼。標題conio.h不是標準C的一部分,因此您可能想要避免這種情況。

LPSTR在windows.h中定義,因爲你已經包含了它,它不應該給任何錯誤。據Typedef的:

typedef char* PSTR, *LPSTR; 

代碼中的其他變量Typedef的,你要檢查,如果他們的頭。嘗試包括Winbase.h

+1

既不是標準C的'windows.h'部分,但我擔心如果他試圖避免這一點,它會變得有點複雜;) – Voo 2012-04-07 12:28:34

+0

當然(額外字符爲SO評論的東西) :) – 2012-04-07 12:29:29

0

從你給我們不能看出它是否有效C因爲你使用非標準的頭和宏。但我可以想象,可能會有宏定義將其變成C代碼。

如果它是C,它不是那麼好,對C++也不是那麼好。兩種語言都有它們初始化變量的方式,但是你的代碼中沒有一個使用它們。特別是在C語言(和C++中的POD)中,有一些用於初始化變量的初始化程序。假設兩個醜陋的宏這裏擴大到類型:

STARTUPINFO si = { 0 }; 
PROCESS_INFORMATION pi = { 0 }; 
如果你有一個C99兼容的編譯器的

第一會更加美好是

STARTUPINFO si = { .cb = sizeof si }; 

如果由於某種原因你需要一個函數爲零出一整塊內存,更好的使用標準功能memset。但是如果你在C中使用正確的初始化器(或者在C++中使用構造器),你應該很少明確地需要它。