我可以创建一个#define并在throw中使用它吗?
Can I make a #define and use it in a throw?
我可以这样做吗?
#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"
相关文章:
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 在函数内部的声明中初始化数组,并在外部使用它
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 定义C++新的环境变量并在 bat 文件中使用它
- Visual Studio 2017 停止工作,并在打开后显示许多控制台窗口
- 如何读取单个字符并在输入两个字符序列时输出? 使用 while 循环和C++
- 在 c++ 中模拟输入并在 JAVA 中读取它?
- 是否有必要获取锁并在不需要唤醒线程时通知condition_variable?
- 将通用对象传递给 Rust 并在使用后传递回 C++ 进行销毁
- 动态获取 esp32 的 mac 地址并在以太网库中使用它.
- 从.txt文件中读取浮点型数字并在公式中使用它们
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 在C++的头文件中使用常量并在程序中询问其地址的任何潜在危险
- C++ 和 Boost.Python - 如何将变量公开给 python 并在循环中更新它?
- 如何在组合框中列出所有可用的 VCL 样式,并在组合框更改事件中应用该样式C++生成器?
- 是否可以在文本文件中找到最长单词的长度,并在同一个文本文件中读取,只需 1 个 while 循环?
- 我可以创建一个#define并在throw中使用它吗?