小编Dan*_*iel的帖子

当std :: fprintf(stderr,...)失败时,操作是否无效或者在失败之前可以写一点?

我有一个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)?

c++ printf c++11

12
推荐指数
2
解决办法
484
查看次数

定制异常层次结构 来自std :: exception和std :: bad_alloc的可怕钻石

我在自己的异常层次结构中存在继承问题.

该类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是一个模糊的基类.

然后:

  1. 有可能以任何方式解决这个问题吗?(我不知道,任何课程或模板技巧)

  2. 如果不是,最好Exception不能继承std::exceptionOutOfMemoryException确实std::bad_alloc

由于其许可许可,我可以破解单元测试框架.

提前谢谢你,对不起,我不是一个很好的英语演讲者.

c++ polymorphism exception multiple-inheritance c++11

6
推荐指数
1
解决办法
736
查看次数

哪个Clang警告等同于GCC的Wzero-as-null-pointer-constant?

我们的项目使用C++ 11/14,我们希望使用nullptr而不是0NULL使用指针,即使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中得到类似的警告呢?

c++ clang compiler-warnings nullptr c++11

6
推荐指数
2
解决办法
1492
查看次数

如何使用派生类中自己的属性正确重写基类原型中的访问器(getter)?错误 TS2610

我有这个有效的 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,然后能够在派生类中定义自己的属性(可枚举)。我认为这样做有非常充分的理由,例如在基类中拥有默认算法(或公开某些私有状态等),但将其替换为派生类实例中定义的属性。 …

typescript

5
推荐指数
0
解决办法
2845
查看次数

如何创建一个将其参数转发给 fmt::format 保持类型安全的函数?

我有两个广泛相关的问题。

我想创建一个函数,将参数转发到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++ c++20 fmt

4
推荐指数
2
解决办法
156
查看次数