簡體   English   中英

C ++ __FILE__宏的類型是什么

[英]C++what is the type of the __FILE__ macro

我正在嘗試創建一個異常類。 為此,我重載了<<運算符。 所以代碼是這樣的

class RunAndCheck
{
     opearator << (boost::any given)
     {

         //Here goes the value of the    "given"

     }
};

用法是這樣的

RunAndCheck s;
s << file->open() << __FILE__ << __LINE__ ; 

所以問題是我想知道FILE的類型,然后我只能從boost::any提取字符串。 任何人都能引起你的好奇心嗎?

__FILE__擴展為字符串文字,就像你直接寫了“/path/to/current/file.cpp”一樣。 字符串文字是不可修改的字符數組左值。

你想要模板<<而不是使用boost :: any:

class RunAndCheck {
public:
    template<class T>
    RunAndCheck& operator<<(const T& value) {
        // ...
        return *this;
    }
};

或者您想為所有可接受的類型提供重載:

class RunAndCheck {
public:
    RunAndCheck& operator<<(const char* value) {
        // ...
        return *this;
    }
    RunAndCheck& operator<<(int value) {
        // ...
        return *this;
    }
};

宏沒有類型,它們只是預處理器所做的文本替換(沒有類型檢查)。 __FILE__丟棄的值的類型是常量C字符串。

__FILE__由字符串文字替換,其類型為

const char[length_of_particular_string]

你應該重新考慮你在做什么。 (意見也基於你之前的問題 。)

首先,boost :: any對這種用法沒有好處(特別是因為字符串文字的類型在不同情況下會有所不同)。 但即使不是技術上的困難,也應該使用正常的函數重載。

更重要的是,似乎您想要的功能是接收布爾值,如果值不為真,則拋出包含文件名和行號的錯誤。 因為你總是需要所有3個組件(雖然根據你的描述可以讓它拋出而不給它文件名,或者讓類沒有任何用處),一個接受這3個參數的函數更有意義。

此外,您現在可以在宏中包裝對此的調用,以便自動提供文件名和行號。

完整示例:

#include <stdexcept>
#include <sstream>
#include <iostream>

void check_result(bool result, const char* line, int line_number)
{
    if (!result) {
        //for example:
        std::stringstream ss;
        ss << line << ' ' << line_number;
        throw std::runtime_error(ss.str()); 
    } 
} 

#define CALL_AND_CHECK(expression) check_result((expression), __FILE__, __LINE__)

bool foobar(bool b) { return b; }

int main()
{
    try {
        CALL_AND_CHECK(foobar(true));
        CALL_AND_CHECK(foobar(false));
    } catch (const std::exception& e) {
        std::cout << e.what() << '\n';
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM