2012-04-07 1 views
0

아래의 코드는 C 언어로 사용되지만, Visual Studio 2008에서는 C++ 프로그램으로 작성했으며 제대로 작동합니다 (C++로 저장 됨). 그러나,이 프로그램은 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

C 또는 C++인지 확인하는 한 가지 방법은 페티센트 플래그가 설정된 C 또는 C++ 컴파일러로 컴파일하는 것입니다. 그러면 비표준 C 또는 C++ 컴파일을 허용하는 컴파일러 확장 또는 기타 컴파일러 불규칙성이 제거됩니다. – mydogisbox

답변

-7

모든 c 코드는 유효한 C++ 코드입니다. 하지만 그 반대가 아닙니다. 따라서 OS API를 C++로 사용하려면 C++로 컴파일해야합니다.

+10

전혀 사실이 아닙니다. C++에는 C가 제공하지 않는 추가 키워드가 있습니다. C 코드는 이러한 키워드를 합법적 인 변수 이름으로 사용할 수 있습니다. 그리고 다른 차이점이 있습니다 : http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B – DCoder

+0

그것이 내가 말한 것입니다. C++는 c의 "수퍼 세트"입니다. 즉, c 코드는 C++ 코드이기도합니다. 하지만 C++ 코드는 항상 C 코드가 아닙니다. – Aftnix

+2

아니요, C++은 내가 말한 링크처럼 C의 엄격한 상위 집합이 아닙니다. – DCoder

6

C으로 깨끗하게 컴파일됩니다. 유일한 오류는 PROCESS_INFORMATION의 구성원이 아니기 때문에 CloseHandle(pi.hthread)에 의해 트리거됩니다. hThread (대문자 T)를 찾고 있습니다.

1

C입니다.하지만 대부분의 C++ 컴파일러는 C 코드를 컴파일 할 수 있습니다. conio.h 헤더는 표준 C의 일부가 아니므로이를 피할 수 있습니다.

LPSTR은 windows.h에 정의되어 있으며 사용자가 포함 했으므로 오류가 없어야합니다.

typedef char* PSTR, *LPSTR; 

코드의 다른 typedef'ed 변수의 경우 해당 헤더가 있는지 확인해야합니다. 사용해보기 Winbase.h

+1

표준 C의'windows.h' 부분도 아니지만 피하려고하면 두려워하니 조금 복잡해질 것입니다;) – Voo

+0

반드시 (덧글에 대한 여분의 문자) :) –

0

비표준 헤더와 매크로를 사용하기 때문에 유효한 C인지 알 수 없습니다. 그러나 이것을 C 코드로 바꾸는 매크로 정의가있을 수 있습니다.

이 C이면 좋지 않으므로 C++에도 좋지 않습니다. 두 언어는 변수를 초기화하는 방법이 있지만 코드는 변수를 사용하지 않습니다. 특히 C와 C++의 POD에는 변수를 초기화하는 초기화 프로그램이 있습니다. 모두 추한 매크로 여기 유형으로 확장하는 것이 가정하면 : 어떤 이유로 당신이 제로에 기능을 필요 싶다면

당신이 C99을 준수 컴파일러가있는 경우의
STARTUPINFO si = { 0 }; 
PROCESS_INFORMATION pi = { 0 }; 

최초의 더 나은

STARTUPINFO si = { .cb = sizeof si }; 

이 될 것입니다 전체 메모리 블록을 사용하려면 더 나은 표준 함수 memset을 사용하십시오. 그러나 C (또는 C++의 생성자)에서 올바른 이니셜 라이저를 사용하는 경우이를 명시 적으로 필요로하지 않아야합니다.

관련 문제