我有一个C++ 11程序,用于std::fprintf写入stderr日志和调试信息.我知道fprintf可以失败并返回负值,但我无法找到操作是否为原子(如果失败,没有效果),或者它可以写入文本的某些部分然后失败(或任何其他副作用).
使用的函数fprintf如下所示:
void writeToConsole (std::string const &message)
{
std::fprintf(stderr, "%s\n", message.c_str());
}
Run Code Online (Sandbox Code Playgroud)
我正在Linux上开发使用Clang和GCC(现在),但我的问题更多是关于标准,所以......
如果std::fprintf失败,仍有可能写入某些字符stderr?此行为是C/C++标准还是实现定义的?
更重要的是,如果std::fprintf失败,我应该中止该程序还是可以在没有副作用的情况下静默执行(除了不可能写入stderr)?
我在自己的异常层次结构中存在继承问题.
该类Exception具有非常好的功能(回溯,日志记录,...),因此它是我的任何异常的基类.它继承自我std::exception在许多网页中看到的建议.此外,我正在使用一个单元测试框架来报告任何std::exception意外抛出.但最后说,这只是为了方便.
然后,我有一个新OutOfMemoryException类,它将由自定义new_handler抛出.此类继承自Exception但仍继承std::bad_alloc与现有代码的兼容性.我猜这更重要,因为new不会再扔std::bad_alloc了.
这里的问题是显而易见的:既然std::bad_alloc来自std::exception,我有一个可怕的钻石情况.
class Exception : public std::exception { };
class OutOfMemoryException : public Exception, public std::bad_alloc { };
Run Code Online (Sandbox Code Playgroud)
遗憾的是,正如你在这里看到的stackoverflow.com ...标准异常不是虚拟继承,所以std::exception是一个模糊的基类.
然后:
有可能以任何方式解决这个问题吗?(我不知道,任何课程或模板技巧)
如果不是,最好Exception也不能继承std::exception或OutOfMemoryException确实不从std::bad_alloc
由于其许可许可,我可以破解单元测试框架.
提前谢谢你,对不起,我不是一个很好的英语演讲者.
我们的项目使用C++ 11/14,我们希望使用nullptr而不是0或NULL使用指针,即使0允许(作为整数文字).
我有以下代码:
int main()
{
int *ptr1 = nullptr; // #1
int *ptr2 = 0; // #2
}
Run Code Online (Sandbox Code Playgroud)
如果我用GCC(5.3.0)编译并且-Wzero-as-null-pointer-constant警告标志#2,但我在Clang中找不到类似的标志.如果我使用Clang(3.7.1)和标志编译代码-Weverything,我不会收到任何警告#2.
那么,有没有办法在Clang中得到类似的警告呢?
我有这个有效的 JavaScript 代码:
class Base {
// Base has an accesor in the prototype
get foo() {
return "getter Base";
}
}
class Deriv extends Base {
// I want define here an own property, hiding the access to the getter,
// but in TypeScript...
// ERROR: 'foo' is defined as an accessor in class 'Base', but is
// overridden here in 'Deriv' as an instance property. (2610)
foo = "prop Deriv";
}
Run Code Online (Sandbox Code Playgroud)
使用useDefineForClassFields: true。
基本上,我希望基类在原型中具有 getter,然后能够在派生类中定义自己的属性(可枚举)。我认为这样做有非常充分的理由,例如在基类中拥有默认算法(或公开某些私有状态等),但将其替换为派生类实例中定义的属性。 …
我有两个广泛相关的问题。
我想创建一个函数,将参数转发到fmt::format(然后std::format在支持增加时转发到)。像这样的东西:
#include <iostream>
#include <fmt/core.h>
constexpr auto my_print(auto&& fmt, auto&&... args) {
// Error here!
// ~~~~~~~~v~~~~~~~~
return fmt::format(fmt, args...);
}
int main() {
std::cout << my_print("{}", 42) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
用 gcc 11.1.0 测试:
In instantiation of ‘constexpr auto my_print(auto:11&&, auto:12&& ...) [with auto:11 = const char (&)[3]; auto:12 = {int}]’:
error: ‘fmt’ is not a constant expression
Run Code Online (Sandbox Code Playgroud)
并使用 clang 12.0.1 进行测试:
error: call to consteval function 'fmt::basic_format_string<char, int &>::basic_format_string<char [3], 0>' is not …Run Code Online (Sandbox Code Playgroud) c++ ×4
c++11 ×3
c++20 ×1
clang ×1
exception ×1
fmt ×1
nullptr ×1
polymorphism ×1
printf ×1
typescript ×1