C++__FILE__宏的类型是啥
Posted
技术标签:
【中文标题】C++__FILE__宏的类型是啥【英文标题】:C++what is the type of the __FILE__ macroC++__FILE__宏的类型是什么 【发布时间】:2011-07-01 04:59:32 【问题描述】:我正在尝试创建一个异常类。为此,我重载了 <<
运算符。所以代码是这样的
class RunAndCheck
opearator << (boost::any given)
//Here goes the value of the "given"
;
用法是这样的
RunAndCheck s;
s << file->open() << __FILE__ << __LINE__ ;
所以问题是我想知道FILE的类型,那么只有我可以从boost::any
中提取字符串。任何人都可以激发您对此的好奇心吗?
【问题讨论】:
【参考方案1】:__FILE__ 扩展为字符串文字,就像您直接编写“/path/to/current/file.cpp”一样。字符串文字是不可修改的字符数组左值。
你想要模板化
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;
;
【讨论】:
我必须根据类型使用一些 if else 条件,比如 if(the input is no) cout @prabhakaran:请务必查看访客的回答。即使我解决了你问的语法/类型问题,另一个是正确的语义解决方案。【参考方案2】:宏没有类型,它们只是预处理器进行的文本替换(没有类型检查)。 __FILE__
放入的值的类型是一个常量 C 字符串。
【讨论】:
@jdehaan 你能进一步解释一下吗?是 C String 是指 CString 还是其他一些 @Stephane Rolland: const char* 不正确,尽管您可以从字符串文字中得到它。 C 字符串不是类。它是一个 const 文字,如果您直接在源代码中键入"c:\path\file.cpp"
。该字符串文字的类型是const char[]
。
@tenfour:从技术上讲,由于历史原因,它的类型(等同于)char[]
,尽管它应该始终被视为const
。
说“宏没有类型”是没有用的。宏扩展为的值具有类型,就像所有值一样。【参考方案3】:
__FILE__
被替换为字符串字面量,其类型为
const char[length_of_particular_string]
你真的应该重新考虑你在做什么。 (意见也基于您的previous question。)
首先, 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';
【讨论】:
非常好的建议,但您可能需要将 __LINE__ 更改为 __FILE__。 :) 查看上一个问题的新编辑 ("***.com/questions/5062699/...;)。以上是关于C++__FILE__宏的类型是啥的主要内容,如果未能解决你的问题,请参考以下文章