Пространство имен 'cmb1' вызывает ошибку компиляции C ++ - PullRequest
2 голосов
/ 07 сентября 2011

Когда я пытаюсь скомпилировать этот код:

#include <windows.h>

namespace cmb1 {
}

void main() {}

я получаю это:

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.
a.cc
a.cc(3) : error C2059: syntax error : 'constant'
a.cc(3) : error C2143: syntax error : missing ';' before '{'
a.cc(3) : error C2447: '{' : missing function header (old-style formal list?)

То же самое для cmb2, cmb3 и cmb4.Я остановился на этом месте.cm4, кстати, компилируется просто отлично.

Я пытался окружить пространство имен чем-то другим:

namespace dilum {
namespace cmb4 {
}
}

Но компиляция все-таки не удалась.

Что происходит

Ответы [ 3 ]

4 голосов
/ 07 сентября 2011

из windows.h:

#define cmb1 0x470
#define cmb2 0x471
#define cmb3 0x472
#define cmb4 0x473
#define cmb5 0x474
#define cmb6 0x475
#define cmb7 0x476
#define cmb8 0x477
#define cmb9 0x478
#define cmb10 0x479
#define cmb11 0x47A
#define cmb12 0x47B
#define cmb13 0x47C
#define cmb14 0x47D
#define cmb15 0x47E
#define cmb16 0x47F
3 голосов
/ 07 сентября 2011

cmb1 может быть макросом, определенным в windows.h. Если макрос расширяется до выражения, компилятор видит

namespace <the_expanded_expression> {
}
2 голосов
/ 07 сентября 2011

Константа cmb1 определяется в <windows.h> следующим образом:

#define cmb1 0x0470

Если вы используете Visual Studio 2010, вы можете навести курсор на красную волнистую стрелку под cmb1, чтобы увидеть определение.

Само собой разумеется, namespace 0x0470 { } не является допустимым объявлением пространства имен.

...