2012-04-07 94 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++中使用构造器),你应该很少明确地需要它。