近期定義了一個宏:ios
my_macro.h #define SHOW_INFO_MACRO() do { }while(0)
使用時 main.cpp:函數
#include ...
#include "my_macro.h" SHOW_INFO_MACRO(); int main() { ... // 省略具體代碼 return 0; }
編譯 main.cpp 會報錯:spa
error C2059: 語法錯誤:「do」 error C2143: 語法錯誤 : 缺乏「;」(在「{」的前面) error C2447: 「{」: 缺乏函數標題(是不是老式的形式表?) error C2059: 語法錯誤:「while」
其實, 哪怕是 main.cppcode
do { } while (); int main() { return 0; } error C2059: 語法錯誤:「do」 error C2143: 語法錯誤 : 缺乏「;」(在「{」的前面) error C2447: 「{」: 缺乏函數標題(是不是老式的形式表?) error C2059: 語法錯誤:「while」
在全局上下文上是不可以使用 do、while、if、else 等語句的, 多是編譯器出於 編譯鏈接的錯誤防範機制, 從而禁止在 全局上下文上禁止直接操做。對象
仍是會有一些狀況, 是但願在 進入main 函數以前執行的, 例如建立維護 「很全局化」的對象數據:blog
#include <stdlib.h> #include <iostream> int g_global_value_1; int g_global_value_2; int g_global_value_3; void initialize_globals() { std::cout <<"func" << std::endl; g_global_value_1 = 1; g_global_value_2 = 2; g_global_value_3 = 3; } initialize_globals(); int main() { std::cout << "main" << std::endl; system( "PAUSE"); return 0; }
是不行的:編譯器
error C4430: 缺乏類型說明符 - 假定爲 int。注意: C++ 不支持默認 int error C2556: 「int initialize_globals(void)」: 重載函數與「void initialize_globals(void)」只是在返回類型上不一樣,參見「initialize_globals」的聲明 error C2371: 「initialize_globals」: 重定義;不一樣的基類型,參見「initialize_globals」的聲明
可是能夠經過 聲明定義 全局變量方式實現:it
#include <stdlib.h> #include <iostream> int g_global_value_1; int g_global_value_2; int g_global_value_3; void initialize_globals() { std::cout <<"func" << std::endl; g_global_value_1 = 1; g_global_value_2 = 2; g_global_value_3 = 3; } class GlobalBooster { public: GlobalBooster() { initialize_globals(); } }; GlobalBooster gb; int main() { std::cout << "main" << std::endl; system( "PAUSE"); return 0; }
在全局上下文中至少有 一下幾件事 是容許的:io
//三個全局變量的聲明 int g_global_value_1; int g_global_value_2; int g_global_value_3; // 函數的聲明和定義 void initialize_globals() // 類的聲明和定義 class GlobalBooster // 全局變量的建立 GlobalBooster gb; // main() 函數的聲明和定義 int main()
但整體來講, 在全局上下文容許的都是 聲明、定義、建立數據; 但沒有 if/else/while/do 這些「邏輯操做?」 的操做, 至於什麼動機, 我還暫時不明白。編譯