我可以创建一个#define并在throw中使用它吗?

Can I make a #define and use it in a throw?

本文关键字:throw 并在 #define 创建 一个 我可以      更新时间:2023-10-16

我可以这样做吗?

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

是的,除了你扔的是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;
    }
}

然而,Joel是正确的,你应该避免这样做。如果您真的想在这里使用宏,请尝试将其用作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;
    }
}

可以。

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

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

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

#define指令的工作原理是在编译应用程序之前用代码中的另一个标记替换一个标记。因此,如果您可以这样做:

throw "is not a valid ID";

你可以这样做:

throw N_VALID;

应该可以。请记住,预处理器在编译器之前运行,并且会将N_VALID替换为"is not a valid ID"

相关文章: