do-while() 模式的宏 出現 語法錯誤do, 乃至 語法錯誤if 的問題

近期定義了一個宏: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 這些「邏輯操做?」 的操做, 至於什麼動機, 我還暫時不明白。編譯

相關文章
相關標籤/搜索