'C# .Net' 카테고리의 다른 글
C# 기본 값(primitive type)의 자동 초기화 (0) | 2024.08.28 |
---|---|
C#과 .NET 버전(version) (0) | 2024.08.28 |
C# 버전(version) (0) | 2024.08.28 |
c# ref 예제 (0) | 2007.06.19 |
C# 난수 (Random Number) (0) | 2007.04.09 |
C# 기본 값(primitive type)의 자동 초기화 (0) | 2024.08.28 |
---|---|
C#과 .NET 버전(version) (0) | 2024.08.28 |
C# 버전(version) (0) | 2024.08.28 |
c# ref 예제 (0) | 2007.06.19 |
C# 난수 (Random Number) (0) | 2007.04.09 |
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#define BUFSIZE 80
#define SM_SERVERR2 89
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
int _tmain(int argc, _TCHAR* argv[])
{
OSVERSIONINFOEX osvi;
SYSTEM_INFO si;
PGNSI pGNSI;
BOOL bOsVersionInfoEx;
ZeroMemory(&si, sizeof(SYSTEM_INFO));
// Try calling GetVersionEx using the OSVERSIONINFOEX structure.
// If that fails, try using the OSVERSIONINFO structure.
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
{
osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) )
return FALSE;
}
switch (osvi.dwPlatformId)
{
// Test for the Windows NT product family.
case VER_PLATFORM_WIN32_NT:
// Test for the specific product.
if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 )
{
if( osvi.wProductType == VER_NT_WORKSTATION )
_tprintf (_T("Microsoft Windows Vista "));
else
_tprintf (_T("Windows Server \"Longhorn\" "));
}
if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )
{
// Use GetProcAddress to avoid load issues on Windows 2000
pGNSI = (PGNSI) GetProcAddress(
GetModuleHandle(_T("kernel32.dll")),
"GetNativeSystemInfo");
if(NULL != pGNSI)
pGNSI(&si);
if( GetSystemMetrics(SM_SERVERR2) )
_tprintf( _T("Microsoft Windows Server 2003 \"R2\" "));
else if( osvi.wProductType == VER_NT_WORKSTATION &&
si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
{
_tprintf( _T("Microsoft Windows XP Professional x64 Edition "));
}
else
_tprintf (_T("Microsoft Windows Server 2003, "));
}
if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )
{
_tprintf (_T("Microsoft Windows XP "));
}
if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
{
_tprintf (_T("Microsoft Windows 2000 "));
}
if ( osvi.dwMajorVersion <= 4 )
{
_tprintf (_T("Microsoft Windows NT "));
}
// Test for specific product on Windows NT 4.0 SP6 and later.
if( bOsVersionInfoEx )
{
// Test for the workstation type.
if ( osvi.wProductType == VER_NT_WORKSTATION &&
si.wProcessorArchitecture!=PROCESSOR_ARCHITECTURE_AMD64)
{
if( osvi.dwMajorVersion == 4 )
_tprintf ( _T("Workstation 4.0 ") );
else if( osvi.wSuiteMask & VER_SUITE_PERSONAL )
_tprintf ( _T("Home Edition ") );
else _tprintf ( _T("Professional ") );
}
// Test for the server type.
else if ( osvi.wProductType == VER_NT_SERVER ||
osvi.wProductType == VER_NT_DOMAIN_CONTROLLER )
{
if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==2)
{
if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64 )
{
if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
_tprintf ( _T("Datacenter Edition for Itanium-based Systems") );
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
_tprintf ( _T("Enterprise Edition for Itanium-based Systems") );
}
else if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )
{
if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
_tprintf ( _T("Datacenter x64 Edition ") );
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
_tprintf ( _T("Enterprise x64 Edition ") );
else _tprintf( _T("Standard x64 Edition ") );
}
else
{
if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
_tprintf ( _T("Datacenter Edition ") );
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
_tprintf ( _T("Enterprise Edition ") );
else if ( osvi.wSuiteMask == VER_SUITE_BLADE )
_tprintf ( _T("Web Edition ") );
else _tprintf ( _T("Standard Edition ") );
}
}
else if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==0)
{
if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
_tprintf ( _T("Datacenter Server ") );
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
_tprintf ( _T("Advanced Server ") );
else _tprintf ( _T("Server ") );
}
else // Windows NT 4.0
{
if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
_tprintf (_T("Server 4.0, Enterprise Edition ") );
else _tprintf ( _T("Server 4.0 ") );
}
}
}
// Test for specific product on Windows NT 4.0 SP5 and earlier
else
{
HKEY hKey;
TCHAR szProductType[BUFSIZE];
DWORD dwBufLen = BUFSIZE * sizeof(_TCHAR);
LONG lRet;
lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
_T("SYSTEM\\CurrentControlSet\\Control\\ProductOptions"),
0, KEY_QUERY_VALUE, &hKey );
if( lRet != ERROR_SUCCESS )
return FALSE;
lRet = RegQueryValueEx( hKey, _T("ProductType"), NULL, NULL,
(LPBYTE) szProductType, &dwBufLen);
RegCloseKey( hKey );
if( (lRet != ERROR_SUCCESS) || (dwBufLen > BUFSIZE) )
return FALSE;
if ( lstrcmpi( _T("WINNT"), szProductType) == 0 )
_tprintf( _T("Workstation ") );
if ( lstrcmpi( _T("LANMANNT"), szProductType) == 0 )
_tprintf( _T("Server ") );
if ( lstrcmpi( _T("SERVERNT"), szProductType) == 0 )
_tprintf( _T("Advanced Server ") );
_tprintf( _T("%d.%d "), osvi.dwMajorVersion, osvi.dwMinorVersion );
}
// Display service pack (if any) and build number.
if( osvi.dwMajorVersion == 4 &&
lstrcmpi( osvi.szCSDVersion, _T("Service Pack 6") ) == 0 )
{
HKEY hKey;
LONG lRet;
// Test for SP6 versus SP6a.
lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
_T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009"),
0, KEY_QUERY_VALUE, &hKey );
if( lRet == ERROR_SUCCESS )
_tprintf( _T("Service Pack 6a (Build %d)\n"),
osvi.dwBuildNumber & 0xFFFF );
else // Windows NT 4.0 prior to SP6a
{
_tprintf( _T("%s (Build %d)\n"),
osvi.szCSDVersion,
osvi.dwBuildNumber & 0xFFFF);
}
RegCloseKey( hKey );
}
else // not Windows NT 4.0
{
_tprintf( _T("%s (Build %d)\n"),
osvi.szCSDVersion,
osvi.dwBuildNumber & 0xFFFF);
}
if ( osvi.wServicePackMajor != 0 )
{
// If no Service Pack has been installed, wServicePackMajor is zero.
_tprintf( _T(" Service Pack Version %d.%d"),
osvi.wServicePackMajor,
osvi.wServicePackMinor );
}
break;
// Test for the Windows Me/98/95.
case VER_PLATFORM_WIN32_WINDOWS:
if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
{
_tprintf (_T("Microsoft Windows 95 "));
if (osvi.szCSDVersion[1]=='C' || osvi.szCSDVersion[1]=='B')
_tprintf(_T("OSR2 ") );
}
if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
{
_tprintf (_T("Microsoft Windows 98 "));
if ( osvi.szCSDVersion[1]=='A' || osvi.szCSDVersion[1]=='B')
_tprintf(_T("SE ") );
}
if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
{
_tprintf (_T("Microsoft Windows Millennium Edition\n"));
}
break;
case VER_PLATFORM_WIN32s:
_tprintf (_T("Microsoft Win32s\n"));
break;
}
system( "pause" );
return 0;
}
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
[VA.C] example for variable number of arguments (0) | 2007.06.18 |
---|---|
overloading on the c++ (0) | 2007.06.14 |
C++ 상수 포인터 (0) | 2007.05.17 |
최대한 잘라먹기(Maximal Munch)와 컴파일러(Compiler) (2) | 2007.05.16 |
TTOF2() 함수 (0) | 2007.05.09 |
overloading on the c++ (0) | 2007.06.14 |
---|---|
현재 윈도우즈 버전 얻기 예제 (0) | 2007.05.19 |
최대한 잘라먹기(Maximal Munch)와 컴파일러(Compiler) (2) | 2007.05.16 |
TTOF2() 함수 (0) | 2007.05.09 |
CMainFrame IDR_MAINFRAME 확장자 연결 문자열 (0) | 2007.04.26 |
http://j2doll.tistory.com/109
소스 출처 : C++ gotchas! 및 Internet
최대한 잘라먹기(Maximal Munch)는 컴파일러(compiler)의 파싱(parsing) 처리 방법 중 한가지 입니다.
컴파일러가 입력한 구문(syntax)을 토큰(token)으로 파싱하여 형태소 분석(lexical analysis)을 하는 과정에서, 가장 긴 토큰을 중심으로 나누어 의미를 두는 과정을 의미합니다.
[이해가 되시면 당신은 천재! 하단의 글은 보실 필요 없습니다.]
+++++p->*mp |
상단의 코드는 C++ 언어로 작성된 코드입니다.
컴파일러는 해당 코드를 독자적인 처리 방법으로 파싱을 합니다.
물론 처리 후 컴파일 성공 또는 오류를 출력합니다.
그런데 상단의 코드에서 애매모호한(ambiguous) 부분이 많습니다.
컴파일러는 ->* 을
-> 와 * 으로 해석할수 도 있고,
->* 로 볼 수도 있습니다.
[솔직히 책에서 설정한 예제가 좋지는 않습니다.]
다음 예제는 STL 로 작성된 코드입니다.
list<vector<string>> loves; |
위의 코드도 애매모호합니다.
꺽쇠 괄호(angle bracket)는 이동 연산자(shift operator) >> 로 해석될 수 있기 때문입니다.
list< vector<string> > loves;
위와 같이 해주면 의미가 명확해 집니다.
[노란색 영역은 공란(space) 입니다.]
자, 이제 문제가 해결되었습니다!!
그런데... 항상 그런 것은 아닙니다!
일부 컴파일러는 컴파일러가 알아서(take care of it) 성공으로 처리합니다.
Visual C++ 2005 같은 경우는 컴파일이 성공합니다. [이 글의 초안은 2007년에 작성되었습니다.]
What the F..?! 이제 대충 감이 오십니까?
최대한 잘라먹기의 현실 세계의 문제점은
'컴파일러의 종류와 버전(version)'마다
최대한 잘라먹기를 처리하는 방법의 차이가 다르다는 것입니다!!
상단의 코드를 gcc 3.4.2 로 컴파일(Compile) 및 빌딩(Building)을 해봅시다.
gcc 3.4.2를 포함하고 있는 Dev-C++ 를 써서 컴파일을 하면
역시 오류가 발생합니다.
그 외에 Dinkumware 에서 제공해주는 웹에서 해보는 컴파일을 해봅시다.
http://www.dinkumware.com/exam/
[참고로 이글의 초안은 2007년에 작성되었으며, 현재 exam 페이지는 폐쇄되었습니다]
MINGW/GCC 에서 컴파일하면,
sourceFile.cpp: In function `int main(int, char**)':sourceFile.cpp:9: `>>' should be `> >' in template class name sourceFile.cpp:12:2: warning: no newline at end of file |
역시 오류가 발생합니다.
다음은 예제 코드를 C99 에서 컴파일하는 경우입니다.
"sourceFile.c", line 9: error: space required between adjacent ">" delimiters of nested template "sourceFile.c", line 12: warning: |
역시 오류입니다. (참고로 Visual C++6(STL98) 에서도 오류입니다)
[하지만, 필자는 최근에 g++ 4.8과 g++ 7.3으로 컴파일 해본 결과, 모두 컴파일에 성공하였습니다.]
이 정도 되면 코드의 버그를 정의하기 애매합니다.
이것이 오류이다!!! 라고 딱 집어 말하기도 애매한 것이지요.
수년전 컴파일러 사용시 버그(bug)로 판명된 코드가
최신 컴파일러에서는 버그가 아닌 것이 됩니다!!
하지만 이건 컴파일러 개발사 만의 문제는 아닙니다.
일부 언어는 코드를 작성시 매우 엄격한 구문을 강요합니다.
탭(tab), 공란(space), 줄바꿈(CR) 등에 대한 정의가 명확한 언어도 있으며, 애매모호한 언어도 있습니다.
일례로, 파이썬(python)의 탭과 공란은 함수 및 루틴(routine) 정의에서 필수적이기에 자바(java)에서의 탭과는 비교할 수 없는 점이 있습니다.
비야네 스트롭의 책으로 C++를 학습한 이들은 띄어쓰기 등을 문맥에서 읽어 낼수는 없습니다.
C++ 배우는 이들이나 컴파일러 개발사만을 매도하기는 문제가 있습니다.
[개발의 고수(guru)들은 상단의 이슈 사항을 다양한 경험을 살려서 알아서~~ 피해 갑니다.
하지만 모두가 고수는 아닙니다. 또한 문제의 해결은 일반적인 경우를 고려하여야 합니다.]
끝으로 한마디 덭붙이면,
구형 컴파일러에서 오류를 내는 방식이 반드시 잘못된 것은 아니라는 점입니다.
애매모호한 코드(ambiguous code)를 오류 처리하는 것이 과연 잘못일까요?
현실 세계에는 맞춤법을 무시한 다양한 관용어(Idiom)를 사용합니다.
언어는 변화하는 것이기에 맞춤법을 준용하는 것이 옳을 수도 있으며,
유연한 관용어구를 사용하는 것이 옳을 수도 있습니다.
표준(standard)을 준용했다면 처리 방법에 대한 정답은 없습니다.
표준이 설명해 주지 못한 부분은 표준 위원회(Committee)가 노력할 일이겠지요.
어쨌든 이런 경우도 알아 두시면
도움이 되시리라 믿습니다. ㅅ-ㅅ
현재 윈도우즈 버전 얻기 예제 (0) | 2007.05.19 |
---|---|
C++ 상수 포인터 (0) | 2007.05.17 |
TTOF2() 함수 (0) | 2007.05.09 |
CMainFrame IDR_MAINFRAME 확장자 연결 문자열 (0) | 2007.04.26 |
GetProcAddress 과 Unicode (0) | 2007.04.14 |
C++ 상수 포인터 (0) | 2007.05.17 |
---|---|
최대한 잘라먹기(Maximal Munch)와 컴파일러(Compiler) (2) | 2007.05.16 |
CMainFrame IDR_MAINFRAME 확장자 연결 문자열 (0) | 2007.04.26 |
GetProcAddress 과 Unicode (0) | 2007.04.14 |
.NET 프레임워크 인식하기 (0) | 2007.04.07 |
최대한 잘라먹기(Maximal Munch)와 컴파일러(Compiler) (2) | 2007.05.16 |
---|---|
TTOF2() 함수 (0) | 2007.05.09 |
GetProcAddress 과 Unicode (0) | 2007.04.14 |
.NET 프레임워크 인식하기 (0) | 2007.04.07 |
SAFEARRAY 생성 / 소거 API 예제 (1) | 2007.04.03 |
Blob URL: 브라우저 내 데이터 처리를 위한 임시 URL (0) | 2024.12.06 |
---|---|
이미지 비율 유지 방법 : html , img (0) | 2024.10.04 |
XML 예약 문자 (0) | 2007.08.17 |
XHTML 과 HTML 사이의 차이점 (0) | 2007.06.09 |
Microsoft XML Notepad 2007 (0) | 2007.04.24 |
출처 :
...XML 편집기의 무료/상용 소프트웨어는 엄청나게 많습니다.
...머...사실 메모장 하나만 달랑 있어도, 시력만 좋다면(?) 누구나 편집 가능하기도 합니다.
...요건 그중 MS 에서 무료로 배포하는 XML 편집기입니다.
...아주 작고 간단합니다.(중요!)
...뛰어난 자동화 기능은 없지만, 간략하게 XML 을 보고, 편집할 수 있습니다.
...관련 프로그램 코더들에게 테스트용으로도 요긴할 것같습니다.
...(물론 VS 가 워낙 좋으니까 비교해서 쓸지는 모르겠지만...)
이 저작물은
크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스
에 따라 이용하실 수 있습니다.
Blob URL: 브라우저 내 데이터 처리를 위한 임시 URL (0) | 2024.12.06 |
---|---|
이미지 비율 유지 방법 : html , img (0) | 2024.10.04 |
XML 예약 문자 (0) | 2007.08.17 |
XHTML 과 HTML 사이의 차이점 (0) | 2007.06.09 |
MSXML: 이해와 활용 가이드 (0) | 2007.04.25 |
최대한 잘라먹기(Maximal Munch)와 컴파일러(Compiler) (2) | 2007.05.16 |
---|---|
TTOF2() 함수 (0) | 2007.05.09 |
CMainFrame IDR_MAINFRAME 확장자 연결 문자열 (0) | 2007.04.26 |
.NET 프레임워크 인식하기 (0) | 2007.04.07 |
SAFEARRAY 생성 / 소거 API 예제 (1) | 2007.04.03 |
디피 헬만(Diffe-Hellman) 알고리즘 이해하기 (0) | 2007.09.14 |
---|---|
과연 정렬 알고리즘을 몇 가지 이상 알아야 훌륭한 개발자인가? (2) | 2007.09.04 |
정팔각형과 계산... (2) | 2007.08.31 |
버스트소스(`Burstsort`) : 알파벳 소문자 정렬의 초고속 정렬 (0) | 2007.06.25 |
피보나치 수열 (Fibonacci number) (0) | 2007.03.21 |
C# 기본 값(primitive type)의 자동 초기화 (0) | 2024.08.28 |
---|---|
C#과 .NET 버전(version) (0) | 2024.08.28 |
C# 버전(version) (0) | 2024.08.28 |
c# ref 예제 (0) | 2007.06.19 |
줄번호 넣기 (Adding line numbers to text) C# (0) | 2007.06.08 |
최대한 잘라먹기(Maximal Munch)와 컴파일러(Compiler) (2) | 2007.05.16 |
---|---|
TTOF2() 함수 (0) | 2007.05.09 |
CMainFrame IDR_MAINFRAME 확장자 연결 문자열 (0) | 2007.04.26 |
GetProcAddress 과 Unicode (0) | 2007.04.14 |
SAFEARRAY 생성 / 소거 API 예제 (1) | 2007.04.03 |