В Visual Studio 2008 (без SP1) я могу скомпилировать и запустить этот код
// vcconsole.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#define NOERROR
#ifdef /*
*/ NOERROR
void pr() {
printf("hello world..\n");
}
#endif
int _tmain(int argc, _TCHAR* argv[])
{
pr();
return 0;
}
Но если я вручную заменю комментарий блока пробелами:
// vcconsole.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#define NOERROR
#ifdef
NOERROR
void pr() {
printf("hello world..\n");
}
#endif
int _tmain(int argc, _TCHAR* argv[])
{
pr();
return 0;
}
не скомпилируется с ошибкой:
1>------ Build started: Project: vcconsole, Configuration: Debug Win32 ------
1>Compiling...
1>vcconsole.cpp
1>c:\x64\winproj\vcconsole\vcconsole.cpp(6) : fatal error C1016: #if[n]def expected an identifier
1>Build log was saved at "file://c:\x64\winproj\vcconsole\Debug\BuildLog.htm"
1>vcconsole - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Почему 2 не эквивалентны?
Это касается меня, потому что я использую инструмент для удаления всех комментариев из моего исходного кода на c ++ (мне нужно сделать это по другим причинам) перед их компиляцией. Если 2 не эквивалентны, мой инструмент может не работать.