0

我知道下面的代码曾经是 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

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 的:

typedef char* PSTR, *LPSTR; 

对于代码中的其他类型定义变量,您必须检查它们的标头是否。尝试包括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++ 的 OS api,那么您应该将其编译为 c++。

于 2012-04-07T12:13:12.513 回答