代码是C还是C ++?

时间:2012-04-07 12:10:00

标签: c++ c compiler-construction

我知道下面的代码曾经是C,但是,我在visual studio 2008中将它作为一个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 个答案:

答案 0 :(得分:6)

它干净利落地编译为C 。唯一的错误是由CloseHandle(pi.hthread)触发的,因为它不是PROCESS_INFORMATION的成员。您正在寻找hThread(大写字母T)。

答案 1 :(得分:1)

它是C.但是大多数C ++编译器都能够编译C代码。标题conio.h不是标准C的一部分,因此您可能希望避免这种情况。

LPSTR在windows.h中定义,因为你已经包含它,所以它不应该给出任何错误。它是typedef'ed:

typedef char* PSTR, *LPSTR; 

对于代码中的其他typedef变量,您必须检查它们的标题。尝试加入Winbase.h

答案 2 :(得分:0)

根据您提供的内容,我们无法看到它是否是有效的C,因为您使用的是非标准的标头和宏。但我可以想象,可能会有宏定义将其转换为C代码。

如果它是C,它就不是那么好了,对C ++也不是那么好。两种语言都有初始化变量的方式,但是你的代码不使用它们。特别是在C(和C ++中的POD)中,有用于初始化变量的初始化器。假设这两个丑陋的宏都扩展到了类型:

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

如果你有一个C99兼容的编译器,第一个甚至会更好

STARTUPINFO si = { .cb = sizeof si };

如果由于某种原因你需要一个函数将整个内存块清零,那么最好使用标准函数memset。但是如果你在C(或C ++中的构造函数)中使用正确的初始化器,你应该很少明确地需要它。

答案 3 :(得分:-7)

每个c代码都是有效的c ++代码。但它不是相反的方式。因此,如果您想使用c ++的OS api,那么您应该将其编译为c ++。