小编pra*_*pin的帖子

使用std :: enable_if在Visual Studio 2015上出现错误C1001

我有一些C++ 11代码无法在Visual Studio 2015(Update 2)上编译,但在Clang和GCC上编译时没有错误.因此,我怀疑Visual Studio中的编译器错误,但也许我的代码在某种程度上是不正确的.

我的真实类BaseUnit是一个double值的模板包装类,注意数量的物理维度(表示为SI单位m,kg,s,K).例如,Speed与Time模板实例的乘法自动给出Distance实例.当前使用标量实现乘法时会出现问题.我尽可能地简化了课程以显示问题.

#include <type_traits>

template<int M>
class BaseUnit
{
public:
    constexpr explicit BaseUnit(double aValue) : value(aValue) {}
    template<typename U, typename std::enable_if<std::is_arithmetic<U>::value, int>::type = 0>
        BaseUnit operator*(U scalar) const { return BaseUnit(value * scalar); }
    template<typename U, typename std::enable_if<std::is_arithmetic<U>::value, int>::type = 0>
        friend BaseUnit operator* (U scalar, BaseUnit v) { return BaseUnit(scalar*v.value); }
protected:
    double value;
};

int main()
{
    BaseUnit<1> a(100);
    a = 10 * a;  // <-- error C1001 here …
Run Code Online (Sandbox Code Playgroud)

c++ c++11 visual-studio-2015

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

如何在 C++23 中将标准库宏与 std 模块一起使用

我目前正在使用 C++ 模块,尝试对我们公司的代码 C++ 基础进行现代化改造,以使用模块来实现核心功能。特别是即将推出的 C++23std模块,作为预编译头的更好替代品,它看起来非常有趣。

所以我使用的是Visual Studio 2022 17.5 Preview 2.0,它对模块有初步支持std。顺便说一句,我遇到了编译器内部错误,我向Microsoft报告了这个错误。

在我们所有的 C++ 源文件中,现在都有一个import std;语句,而且效果很好。每个应该位于std命名空间中的标识符似乎都按预期导出。我测量到与之前使用预编译头相比,编译时间略有减少。

我发现,如果你,你在任何标准import std;C++ 头文件中都会遇到很多奇怪的编译错误,因为 Microsoft 编译器会感到困惑并抱怨重新定义。所以我小心翼翼地将它们全部删除。 #include <>

我的问题是,标准库中定义了一些(主要是在 C 兼容库中),这些宏显然没有导出,因为 C++ 模块在设计上从不导出宏

我们的代码库使用的标准宏数量非常有限,但我认为很难避免它们。以下是它们的简短列表(不确定是否完整):

  • stdout
  • errno
  • va_start, va_arg,va_end

对于va_*宏,我#include <stdarg.h>和它在 VS 2022 上编译得很好,尽管它打破了我之前提到的规则。这可能是因为该标头几乎只有宏。但对于stdouterrno,我不知道该怎么办。

C++23 是否指定在导入模块时如何访问重要的标准宏,例如stdout或?有没有好的解决方法?errnostd

c++ c++-modules c++23

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

如何将指针传递给LuaJIT ffi以用作out参数?

假设有以下C代码:

struct Foo { int dummy; }
int tryToAllocateFoo(Foo ** dest);
Run Code Online (Sandbox Code Playgroud)

...如何在LuaJIT中进行以下操作?

Foo * pFoo = NULL;
tryToAllocateFoo(&pFoo);
Run Code Online (Sandbox Code Playgroud)

lua ffi luajit

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

"使用Lua的未定义引用"

undefined reference to 'luaL_newstate'在尝试构建项目时遇到错误.我知道这是链接器的一个错误,但我对Lua相对较新,并为项目添加了一个库.我顺便使用Code :: Blocks.API函数luaL_openlibs,luaL_loadfile,lua_pcall,lua_getfield,lua_type,lua_settop 失踪了.

我在网站上看到我必须将我的项目与libdl链接才能解决这个问题,但我真的不知道它是什么意思以及如何去做.

c++ lua reference

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

自定义支持__attribute __((格式))

GCC和Clang都支持对变量参数函数进行编译时检查printf.这些编译器接受如下语法:

extern void dprintf(int dlevel, const char *format, ...)
  __attribute__((format(printf, 2, 3)));  /* 2=format 3=params */
Run Code Online (Sandbox Code Playgroud)

在OSX上,Cocoa框架也使用它的扩展NSString:

#define NS_FORMAT_FUNCTION(F,A) __attribute__((format(__NSString__, F, A)))
Run Code Online (Sandbox Code Playgroud)

在我们公司,我们有一个自定义C++框架,其中包含一大堆类,如BaseString所有类BaseObject.在BaseString有几个可变参数的方法类似sprintf,但也有一些扩展.例如,"%S"期望一个类型的参数BaseString*,并"%@"期望一个BaseObject*参数.

我想对我们项目中的参数执行编译时检查,但由于扩展,会__attribute__((format(printf)))给出大量误报警告.

有没有办法定制__attribute__((format))两个编译器之一的支持?如果这需要编译器源的补丁,它是否可以在合理的时间内完成?或者,是否还有其他类似工具的lint可以执行检查?

c c++ printf gcc clang

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

Git:如何防止特定提交合并到另一个分支?

我们公司的Git工作流程如下:我们有一个master分支机构,一些feature/*分支机构来开发新功能,这些功能master在工作完成后合并回来,还有release/*分支机构.这些分支是在产品发布之前创建的,专为错误修复而设计,没有新功能,然后这些错误修复会偶尔合并到master分支中.

不时,它发生的特定提交的release/*分支是我们的改变并不想合并回master:当版本号递增例如.由于分支中还有其他重要的修复,因此肯定有人迟早将所述本地提交合并到master主分支中.

我所知道的当前"解决方案"是在完成本地提交后立即合并release/*分支master,还原本地提交然后推送.它有点工作,但历史不干净.此外,这不会阻止将本地提交合并到另一个分支中master.

在描述的工作流程中有没有更好的方法来解决这个问题?

git merge

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

为什么从浮点到整数的转换会截断?

在C和C++中,我们都知道将浮点值转换为整数会执行截断。这意味着,无论是对于C 风格的转换还是对于 C 风格的转换,都将修复为零static_cast

static_assert(static_cast<int>(2.9) == 2);
static_assert((int)-3.7 == -3);
Run Code Online (Sandbox Code Playgroud)

要将浮点数转换为整数,有 4 个选项,每个选项都由以下标准函数实现<cmath>

  1. round
  2. floor
  3. ceil
  4. trunc

我根据自己的经验,从最常用到最不常用的顺序排列了选项(这有点主观)。

向零截断意味着从 -0.999... 到 0.999... 的所有值都转换为 0。因此存在接近 0 的数学异常,这使得截断很少有用。我的印象是,几乎每次程序员直接将浮点转换为整数时,他实际上想要floor,但可以承受trunc行为,因为该值应该始终为正数。

我的问题是:选择第四个选项截断的动机是什么?我敢打赌这主要是历史性的,但是当 C 最初开发时,一定有一些充分的理由选择截断而不是更有用的舍入或下限。

c++ floating-point rounding

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

嵌入Lua 5.2并定义库

Lua附带了5.2版本的免费在线参考手册(我正在使用),也可以使用Lua中的5.0版编程.

然而,这些版本之间有一些变化,我似乎无法超越.这些更改在5.25.1参考手册的后续版本中有所说明.注意连续弃用有luaL_openlib()利于luaL_register(),然后luaL_register()赞成luaL_setfuncs().

网上搜索结果不一,其中大多数指向luaL_register().

我尝试实现的目标可以通过以下迷你程序进行总结,该程序可以编译并链接,例如, gcc ./main.c -llua -ldl -lm -o lua_test

#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

#include <stdio.h>
#include <string.h>


static int test_fun_1( lua_State * L )
{
    printf( "t1 function fired\n" );
    return 0;
}

int main ( void )
{
    char buff[256];
    lua_State * L;
    int error;

    printf( "Test starts.\n\n" );

    L = luaL_newstate();
    luaL_openlibs( L …
Run Code Online (Sandbox Code Playgroud)

c embed lua

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

在同一个线程上提升互斥锁定

我是升级库的新手,它是如此惊人的库!此外,我是互斥的新手,所以请原谅我,如果我犯了新手的错误.

无论如何,我有两个函数叫FunctionOneFunctionTwo.FunctionOne并且FunctionTwo由不同的线程异步调用.所以这就是发生的事情:在FunctionOne,我在函数的开头锁定一个全局互斥锁,并在函数结束时解锁全局互斥锁.同样的事情FunctionTwo.

现在问题在于:有时,FunctionOne并且FunctionTwo被称为相隔不到几毫秒(但并非总是如此).因此,FunctionOne开始执行并FunctionTwo执行中途.当FunctionTwo 锁定互斥体,整个线程FunctionOneFunctionTwo上停止,所以FunctionOne被套牢中途通过,并在自己的线程等待FunctionTwo,直到永远.所以,总结一下:

  • 功能1锁定互斥锁并开始执行代码.
  • 函数2在几毫秒后调用并锁定互斥锁,冻结线程函数1和2打开​​.
  • 现在func 1被中途停留并且线程被冻结,因此func 1永远不会完成并且互斥锁永远被锁定,等待func 1完成.

在这种情况下做什么?这是我的代码:

boost::mutex g_Mutex;
lua_State* L;

// Function 1 is called from some other thread
void FunctionOne()
{
    g_Mutex.lock();

    lua_performcalc(L);

    g_Mutex.unlock();
}

// Function 2 is called from some other thread a few ms later, freezing the thread
// and Function 1 …
Run Code Online (Sandbox Code Playgroud)

c++ lua boost mutex

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

调用隐藏好友功能

考虑以下代码:

struct A
{
    friend void foo(A& a) {}
};
struct B
{
    void foo()
    {
        A a;
        foo(a); // doesn't compile because "foo" friend function is hidden
    }
};

int main()
{
    A a;
    foo(a); // OK here
}
Run Code Online (Sandbox Code Playgroud)

在函数中main,我可以轻松调用foo类内定义的友元函数A

在函数中,B::foo相同的代码无法编译,因为友元函数通过其成员函数foo隐藏在类内部B

有没有办法调用原来的隐藏函数而B不用重命名B::foo?我尝试使用::foo(a);orA::foo(a);但它们都不能编译。

c++ friend-function

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