小编Vit*_*meo的帖子

指针是否延长了自动存储变量的生命周期?

int main() 
{
    float* ptr;

    {
        float f{10.f};
        ptr = &f;
    }

    *ptr = 13.f;
    // Do more stuff with `*ptr`...
}
Run Code Online (Sandbox Code Playgroud)

它使用/访问有效或未定义的行为*ptr

我测试了类似于上面示例的情况,并且所有内容似乎都起作用,好像嵌套块中变量的生命周期由于指针而被扩展.

我知道const&(const引用)将延长临时的生命周期.指针是否相同?

c++ variables storage pointers automatic-storage

1
推荐指数
2
解决办法
472
查看次数

错误:`#elif没有表达式` - 仅在Windows上发生

我正在尝试使用我在Windows上制作的库来编译项目,使用MinGW 4.8.1 x86.该项目在Linux上编译良好.

Common.hpp包含在其他所有内容之前,并根据当前操作系统定义一些宏.然后包含ConsoleFmt.hpp,它包含一个文件,具体取决于先前定义的宏.

我收到一个错误 - 这是代码和错误消息:


Common.hpp

#if (__linux || __unix || __posix)
    #define SSVU_OS_LINUX
#elif (_WIN64 || _WIN32)
    #define SSVU_OS_WINDOWS
#else
    #define SSVU_OS_UNKNOWN
#endif
Run Code Online (Sandbox Code Playgroud)

ConsoleFmt.hpp

#include "Common.hpp"

#ifdef SSVU_OS_LINUX
    #include "SSVUtils/Core/ConsoleFmt/Internal/ConsoleFmtImplUnix.hpp"
#elif SSVU_OS_WINDOWS
    #include "SSVUtils/Core/ConsoleFmt/Internal/ConsoleFmtImplWin.hpp"
#else
    #include "SSVUtils/Core/ConsoleFmt/Internal/ConsoleFmtImplNull.hpp"
#endif
Run Code Online (Sandbox Code Playgroud)

错误:

错误:#elif没有表达式:

#elif SSVU_OS_WINDOWS

我的代码无效或MinGW中是否有错误?我想我使用#elif得当.

c++ gcc mingw g++

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

避免“enum”中的变体名称和类型重复

我发现自己经常定义enum如下类型:

struct Foo { }
struct Bar { }
struct Baz { }

enum MyEnum {
    Foo(Foo),
    Bar(Bar),
    Baz(Baz),
}
Run Code Online (Sandbox Code Playgroud)

我发现重复的内容Foo(Foo)不雅且多余。它还使初始化变得多余:

let example = MyEnum::Foo(Foo{ /* ... */ });
Run Code Online (Sandbox Code Playgroud)

我想编写类似以下伪代码的内容:

struct Foo { }
struct Bar { }
struct Baz { }

type_enum MyEnum {
    Foo,
    Bar,
    Baz,
}

let example = MyEnum::Foo{ /* ...anything that `Foo` supports ... */ };
Run Code Online (Sandbox Code Playgroud)

std::variant上面的内容与C++17 中的非常相似。Rust 支持类似的东西吗?

enums rust

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

概括编译时和运行时评估

在某些情况下,我可能需要使用相同的行为/代码,其值有时在运行时和编译时是已知的.这会导致代码重复:

template<int TValue> struct CompileTime
{
    int duplicate() { return TValue * 2; }
};

struct RunTime
{
    int value;
    RunTime(int mValue) : value{mValue} { }
    int duplicate() { return value * 2; }
};

int main()
{
    // I need to duplicate a compile-time known value first...
    CompileTime<2>{}.duplicate();

    // And now I need to duplicate a run-time value...
    int value; std::cin >> value;
    RunTime{value}.duplicate();
}
Run Code Online (Sandbox Code Playgroud)

显然这个例子真的很愚蠢,但有什么方法可以避免重复这种行为duplicate()(但是,需要存储该值.)

理想情况下,我想写:

int main() 
{
    // 2 is known at compile-time, …
Run Code Online (Sandbox Code Playgroud)

c++ templates compile-time c++11

0
推荐指数
1
解决办法
128
查看次数

<boost/program_options/options_description.hpp>有什么问题?

我需要帮助,我一直在同一台计算机上执行此操作,这意味着我已经安装了boost库,并且基于之前的代码,但这次它给了我错误:/tmp/ccpAYzPw.o:在函数`main' :

reading_data.cpp:(.text+0x356): undefined reference to `boost::program_options::options_description::m_default_line_length'
reading_data.cpp:(.text+0x361): undefined reference to `boost::program_options::options_description::m_default_line_length'
reading_data.cpp:(.text+0x3a6): undefined reference to `boost::program_options::options_description::options_description(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int, unsigned int)'
reading_data.cpp:(.text+0x3d3): undefined reference to `boost::program_options::options_description::add_options()'
collect2: error: ld returned 1 exit status
<builtin>: recipe for target 'reading_data' failed
Run Code Online (Sandbox Code Playgroud)

我花了差不多2个小时看看发生了什么?但我无法理解为什么,所以我需要你的帮助.

这是我的代码,非常感谢你.

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>      // std::ifstream
#include <boost/program_options.hpp>

int main ()
{
    boost::program_options::options_description desc("Allowed options");

    desc.add_options()
            ("sign"  , program_options::value<string>()  -> default_value("gbm")    ,"name of the input")
            ("week"  , program_options::value<double>()  -> default_value(1930)     ,"number …
Run Code Online (Sandbox Code Playgroud)

c++ boost

-1
推荐指数
1
解决办法
692
查看次数

将`char*`与`delete`解除分配 - 内存泄漏?

template<typename T> char* allocateSomething()
{
    return reinterpret_cast<char*>(std::allocator<T>{}.allocate(1));
}

void deallocateSomething(char* mPtr) { delete mPtr; }

struct TestType { ... };

int main()
{
    char* ptr{allocateSomething<TestType>()};
    deallocateSomething(ptr);   
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

是否可以保证deallocateSomething(ptr)释放所有已分配的字节,即使它typename T在调用时不知道使用的是什么allocateSomething<T>()

还是有必要模板化deallocateSomething

编辑:我手动处理对象的构造/销毁.


编辑2:这会正常工作吗?

template<typename T> char* allocateSomething()
{
    return reinterpret_cast<char*>(std::malloc(sizeof(T)));
}

void deallocateSomething(char* mPtr) { std::free(mPtr); }

// ...
Run Code Online (Sandbox Code Playgroud)

c++ memory memory-management c++11

-2
推荐指数
1
解决办法
208
查看次数