当我尝试编译这段代码时:
#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 { } }
但编译仍然失败。
到底是怎么回事?
从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
cmb1
可能是一个在windows.h
定义的宏。 如果宏扩展自己的表达式,编译器看到
namespace <the_expanded_expression> { }
常量cmb1
在<windows.h>
定义如下:
#define cmb1 0x0470
如果您使用的是Visual Studio 2010,则可以将鼠标悬停在cmb1
下方的红色波浪形箭头上以查看定义。
不用说, namespace 0x0470 { }
不是有效的命名空间声明。