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