我有一些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++ 基础进行现代化改造,以使用模块来实现核心功能。特别是即将推出的 C++23std模块,作为预编译头的更好替代品,它看起来非常有趣。
所以我使用的是Visual Studio 2022 17.5 Preview 2.0,它对模块有初步支持std。顺便说一句,我遇到了编译器内部错误,我向Microsoft报告了这个错误。
在我们所有的 C++ 源文件中,现在都有一个import std;语句,而且效果很好。每个应该位于std命名空间中的标识符似乎都按预期导出。我测量到与之前使用预编译头相比,编译时间略有减少。
我发现,如果你,你在任何标准import std;C++ 头文件中都会遇到很多奇怪的编译错误,因为 Microsoft 编译器会感到困惑并抱怨重新定义。所以我小心翼翼地将它们全部删除。 #include <>
我的问题是,标准库中定义了一些宏(主要是在 C 兼容库中),这些宏显然没有导出,因为 C++ 模块在设计上从不导出宏。
我们的代码库使用的标准宏数量非常有限,但我认为很难避免它们。以下是它们的简短列表(不确定是否完整):
stdouterrnova_start, va_arg,va_end对于va_*宏,我#include <stdarg.h>和它在 VS 2022 上编译得很好,尽管它打破了我之前提到的规则。这可能是因为该标头几乎只有宏。但对于stdout和errno,我不知道该怎么办。
C++23 是否指定在导入模块时如何访问重要的标准宏,例如stdout或?有没有好的解决方法?errnostd
假设有以下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) 我undefined reference to 'luaL_newstate'在尝试构建项目时遇到错误.我知道这是链接器的一个错误,但我对Lua相对较新,并为项目添加了一个库.我顺便使用Code :: Blocks.API函数luaL_openlibs,luaL_loadfile,lua_pcall,lua_getfield,lua_type,lua_settop 失踪了.
我在网站上看到我必须将我的项目与libdl链接才能解决这个问题,但我真的不知道它是什么意思以及如何去做.
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可以执行检查?
我们公司的Git工作流程如下:我们有一个master分支机构,一些feature/*分支机构来开发新功能,这些功能master在工作完成后合并回来,还有release/*分支机构.这些分支是在产品发布之前创建的,专为错误修复而设计,没有新功能,然后这些错误修复会偶尔合并到master分支中.
不时,它发生的特定提交的release/*分支是我们的改变并不想合并回master:当版本号递增例如.由于分支中还有其他重要的修复,因此肯定有人会迟早将所述本地提交合并到master主分支中.
我所知道的当前"解决方案"是在完成本地提交后立即合并release/*分支master,还原本地提交然后推送.它有点工作,但历史不干净.此外,这不会阻止将本地提交合并到另一个分支中master.
在描述的工作流程中有没有更好的方法来解决这个问题?
在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>:
roundfloorceiltrunc我根据自己的经验,从最常用到最不常用的顺序排列了选项(这有点主观)。
向零截断意味着从 -0.999... 到 0.999... 的所有值都转换为 0。因此存在接近 0 的数学异常,这使得截断很少有用。我的印象是,几乎每次程序员直接将浮点转换为整数时,他实际上想要floor,但可以承受trunc行为,因为该值应该始终为正数。
我的问题是:选择第四个选项截断的动机是什么?我敢打赌这主要是历史性的,但是当 C 最初开发时,一定有一些充分的理由选择截断而不是更有用的舍入或下限。
Lua附带了5.2版本的免费在线参考手册(我正在使用),也可以使用Lua中的5.0版编程.
然而,这些版本之间有一些变化,我似乎无法超越.这些更改在5.2和5.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) 我是升级库的新手,它是如此惊人的库!此外,我是互斥的新手,所以请原谅我,如果我犯了新手的错误.
无论如何,我有两个函数叫FunctionOne和FunctionTwo.FunctionOne并且FunctionTwo由不同的线程异步调用.所以这就是发生的事情:在FunctionOne,我在函数的开头锁定一个全局互斥锁,并在函数结束时解锁全局互斥锁.同样的事情FunctionTwo.
现在问题在于:有时,FunctionOne并且FunctionTwo被称为相隔不到几毫秒(但并非总是如此).因此,FunctionOne开始执行并FunctionTwo执行中途.当FunctionTwo 锁定互斥体,整个线程FunctionOne和FunctionTwo上停止,所以FunctionOne被套牢中途通过,并在自己的线程等待FunctionTwo,直到永远.所以,总结一下:
在这种情况下做什么?这是我的代码:
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) 考虑以下代码:
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);但它们都不能编译。