如何在c ++的构造函数中使用__FILE__和__LINE__作为默认参数?

use*_*741 6 c++ c-preprocessor

我试图在构造函数中使用__FILE____LINE__宏作为默认参数,但我似乎无法让宏使用正确的文件.他们不断扩展我的头文件.

更详细:我想要将对象实例化为我的类成员的文件和行号.但是每次我想使用这些对象时,我都不想手动输入参数.我知道有办法做到这一点,但我不能为我的生活弄清楚.我目前正在做的是以下内容:

在我的头文件中:

mnNumber( float x, const char* filename = __FILE__, int linenumber = __LINE__ ): 
          value( x ), mFileName( filename ), mFunctionName( nullptr ), mLineNumber(     linenumber ), mID( 0 )
Run Code Online (Sandbox Code Playgroud)

但是,FILELINE会扩展,好像它们来自我的头文件,而不是我使用mnNumber的实际位置.

要回答我为什么要这样做的问题,我想让代码读取它自己的代码页.我使用的特定值正在管理器中注册,并且最终用户可以编辑它们的值.当最终用户完成编辑值后,该值将被写回代码页.所以,我需要知道价值来自哪里.我还允许最终用户说他们永远不需要再次编辑这个值,当他们单击该按钮时,该值将从mnNumber转换回float,并且代码页上的类型将被重写为float .或者,希望......

对我有什么建议吗?

Rob*_*obᵩ 6

您可以使用预处理器执行此操作.创建一个扩展为__LINE__并使用它的宏:

struct S {
  S(int line, const std::string& file) :
    line(line), file(file) {
  }
  std::string file;
  int line;
};

#define SCons() S(__LINE__, __FILE__)

int main () {

  S s1 = SCons();
  S s2 = SCons();
  std::cout << s1.line << "\n";
  std::cout << s2.line << "\n";
}       
Run Code Online (Sandbox Code Playgroud)


小智 2

你不能这样做——这两个宏在遇到它们时会被预处理器替换,因此它们将被交换为头文件名和行号。