我可以制作#define并在投掷中使用它吗?

时间:2013-05-21 17:01:45

标签: c++ macros try-catch

我可以制作这样的东西吗?

#define N_VALID "is not a valid ID"  
...  
throw N_valid;  
...  
catch(char *message){  
fprintf(stderr,"%s",message);}  

5 个答案:

答案 0 :(得分:4)

是的,除了您投掷的是const char *,而不是char *https://ideone.com/UsnitG

#include <iostream>
using std::cout; using std::endl;

#define N_VALID "is not a valid ID"

void function_throws()
{
  throw N_VALID;
}

int main()
{
    try
    {
        function_throws();
    }
    catch(const char *message) // <= Note the const here!
    {
        cout << message << endl;
    }
}

然而,乔尔是正确的,你应该避免这样做。如果您真的想在这里使用宏,请尝试将其用作std :: exception对象的参数:https://ideone.com/Dsx1RF

void function_throws()
{
  throw invalid_argument(N_VALID);
}

int main()
{
    try
    {
        function_throws();
    }
    catch(const invalid_argument& ex)
    {
        cout << "invalid_argument: " << ex.what() << endl;
    }
}

答案 1 :(得分:1)

#define N_VALID "is not a valid ID" 

throw N_VALID;
throw "is not a valid ID";

一旦预处理完成,上面的两行在编译器眼中完全相同。

答案 2 :(得分:0)

这是合法但不道德的。你应该总是抛出一个对象,以便你的客户可以单独处理你的错误,而不是在一个catch中有一个巨大的if语句。

答案 3 :(得分:0)

#define指令的工作原理是在编译应用程序之前将代码替换为代码中的另一个标记。因此,如果你能做到这一点:

throw "is not a valid ID";

你可以这样做:

throw N_VALID;

答案 4 :(得分:0)

它应该工作。请记住,预处理器在编译器之前运行,并将N_VALID替换为“不是有效ID”