代码是C还是C++?

问题描述 投票:0回答:4

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

}  
c++ c
4个回答
6
投票

它可以像 C 一样干净地编译。唯一的错误是由 CloseHandle(pi.hthread)

 触发的,因为它不是 
PROCESS_INFORMATION
 的成员。您正在寻找 
hThread
(大写 T)。


1
投票
它是C。但是大多数C++编译器都能够编译C代码。标头

conio.h

 不是标准 C 的一部分,因此您可能需要避免这种情况。

LPSTR

 是在 windows.h 中定义的,既然你已经包含它,它不应该给出任何错误。它是类型定义的:

typedef char* PSTR, *LPSTR;

对于代码中的其他 typedef 变量,您必须检查它们的标头是否正确。尝试包括

Winbase.h


    


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

如果是C,那么它就不是那么好的一个,对于C++来说也不是那么好的一个。两种语言都有自己的初始化变量的方法,但您的代码没有使用它们。特别是在 C 中(以及 C++ 中的 POD),有用于初始化变量的初始化器。假设这里两个丑陋的宏都扩展到类型:

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

如果你有一个兼容 C99 的编译器,第一个就更好了

STARTUPINFO si = { .cb = sizeof si };

如果由于某种原因您需要一个函数将整个内存块清零,最好使用标准函数

memset

 。但是,如果您在 C 中使用正确的初始值设定项(或 C++ 中的构造函数),您应该很少需要明确地这样做。


-6
投票
每个 C 代码都是有效的 C++ 代码。但事实并非相反。因此,如果你想使用 C++ 的操作系统 api,那么你应该将其编译为 c++。

© www.soinside.com 2019 - 2024. All rights reserved.