小编loo*_*oop的帖子

C++ - 传递给线程的数据是否应该是易失性的?

在Microsoft Visual C++中,我可以通过启动带有一个void *参数的函数来调用CreateThread()来创建线程.我将指向结构的指针作为该参数传递,我看到很多其他人也这样做了.

我的问题是,如果我传递指向我的结构的指针,我如何知道在调用CreateThread()之前结构成员是否已实际写入内存?有没有保证他们不会被缓存?例如:

struct bigapple { string color; int count; } apple;
apple.count = 1;
apple.color = "red";
hThread = CreateThread( NULL, 0, myfunction, &apple, 0, NULL );

DWORD WINAPI myfunction( void *param )
{
    struct bigapple *myapple = (struct bigapple *)param;

    // how do I know that apple's struct was actually written to memory before CreateThread?
    cout << "Apple count: " << myapple->count << endl; 
}
Run Code Online (Sandbox Code Playgroud)

今天下午,在我阅读的时候,我在这个网站上看到了很多Windows代码,而其他人则传递了一些不易变为线程的数据,并且似乎没有任何内存障碍或其他任何内容.我知道C++或者至少旧的版本不是"线程感知"所以我想知道是否还有其他原因.我的猜测是编译器看到我在调用CreateThread()时传递了指针和苹果,因此它知道apple在调用之前写出成员.

谢谢

c++ volatile thread-safety visual-c++

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

测试std :: is_integral和std :: is_signed?

我有一个函数,但我想将它分成两个函数,一个用于返回有符号整数,另一个用于无符号整数.它看起来std::is_signed不是严格的整数所以我想如果我可以模板测试的东西,std::is_integral<T>::value && std::is_signed<T>::value但这不起作用.现在我将签名测试作为if语句:

template<typename T>
typename std::enable_if
<
    std::is_integral<T>::value,
    T
>::type
foo()
{
    if( std::is_signed<T>::value )
    {
        //signed
    }
    else
    {
        //unsigned
    }
}
Run Code Online (Sandbox Code Playgroud)


编辑.我正在使用Visual Studio 2010.实际上看起来发生的事情是Visual Studio不会接受两个模板,一个带有std::is_integral<T>::value && std::is_signed<T>::value,一个带有std::is_integral<T>::value && std::is_unsigned<T>::value.它告诉我function template has already been defined.我这样做是错误的,是否有更标准的兼容方式来拥有两个函数,一个用于返回无符号整数,另一个用于有符号积分?

c++ templates c++11

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


退出循环退出函数

我今天下午一直在Inno Setup编写代码,然后我阅读了一些Pascal文档,其中说exit用于退出循环.我尝试在我的代码中使用它,而是退出该函数.例如,在此函数中,永远不会显示消息框:

function NextButtonClick(CurPageID: Integer): Boolean;
var i: Integer;
begin
    Result := True;

    for i := 0 to 4 do
    begin
        exit
    end;

    MsgBox('test',mbInformation,MB_OK);
end;
Run Code Online (Sandbox Code Playgroud)

我做了一些谷歌搜索,Pascal也有break关键字,所以我使用它,它工作正常.难道exit真的要被用来退出该功能?我记得今天下午读到的Pascal没有相当于C风格的返回语句.

我真的需要一些关于Inno Setup正在使用的Pascal版本的文档.我已经阅读了Inno帮助页面,但它们没有涵盖这样的内容.谢谢

pascal inno-setup

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

git忽略一个分支而不是另一个分支

在github上有一个不是我的存储库.我克隆了它,所以现在我在我的github帐户中有它的副本,我在我的计算机上有一份该repo的副本.我创建了一个分支,它有自己的目录和大量文件,然后我将其提交给该分支,称之为apple.当我切换回主分支时,我注意到状态中我在Apple上提交的目录及其中的所有文件都显示在状态中.所以现在我有一百个左右的文件,每次切换到master都可以看到.

我的问题是我怎样才能做到这一点,当我切换回来掌握那些我在苹果分支中的文件时会被忽略?我确信我可以在master中修改.gitignore,但这会改变项目的.gitignore.

谢谢


编辑:评论者指出,如果文件是在另一个分支中提交的,当我切换分支时它们不应该出现,这是正确的.与我在这里帮助过我的人一起工作后发现我在Apple分支上创建的目录中的一个子目录有自己的.gitignore,忽略了很多文件.那个.gitignore是在apple分支中提交的,当我切换分支(例如到主分支)时,特定于目录的.gitignore消失了,并且最初在apple分支上被忽略的所有文件都出现在git-gui的任何其他分支中没有跟踪.所以我有很多文件,我认为这些文件是在苹果分支上提交的,但实际上却没有.对困惑感到抱歉!我将标记Ryan Stewart的答案是正确的.

git github

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

C++ istream:gcount() 是否总是在 read() 之后设置,即使它失败了?

我正在使用 istream 和 read() 读取一些数据。我想知道我是否可以只测试 gcount() 的字节,或者我是否需要在调用 gcount() 之前测试一些 good()、eof() 等的组合。换句话说,即使由于 EOF 或其他一些内部问题导致读取失败, gcount() 是否总是在 read() 之后设置?

此外,如果这在标准或您可以引用的地方有所描述。我使用 cplusplus.com 作为参考,它说 gcount“返回对对象执行的最后一次未格式化输入操作提取的字符数。” 无论结果如何,我是否可以将诸如“最后一次操作”之类的语句解释为“最后一次操作”?

c++ istream

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

转换为uint64时,int32或32位指针的意外符号扩展

我使用Visual Studio 2010(cl.exe /W4)作为C文件编译此代码:

int main( int argc, char *argv[] )
{
    unsigned __int64 a = 0x00000000FFFFFFFF;
    void *orig = (void *)0xFFFFFFFF;
    unsigned __int64 b = (unsigned __int64)orig;
    if( a != b )
        printf( " problem\ta: %016I64X\tb: %016I64X\n", a, b );
    return;
}
Run Code Online (Sandbox Code Playgroud)

没有警告,结果是:

问题a:00000000FFFFFFFF b:FFFFFFFFFFFFFFFF

我想int orig = (int)0xFFFFFFFF不会引起争议,因为我没有指定一个整数的指针.但结果是一样的.

有人可以向我解释在C标准中它覆盖的orig是从0xFFFFFFFF扩展到0xFFFFFFFFFFFFFFFF的符号吗?

我原以为(unsigned __int64)orig会变成0x00000000FFFFFFFF.似乎转换首先是签名的__int64类型,然后它变为无符号?

编辑:这个问题已被回答,指针是符号扩展,这就是为什么我在gcc和msvc中看到这种行为.但是我不明白为什么当我做类似的事情时(unsigned __int64)(int)0xF0000000,符号扩展到0xFFFFFFFFF0000000,但是(unsigned __int64)0xF0000000没有显示我想要的是0x00000000F0000000.

编辑:上述编辑的答案.(unsigned __int64)(int)0xF0000000符号扩展的原因是因为,如用户R所述:

有符号类型(或任何类型)到无符号类型的转换 总是通过减少模1加上目标类型的最大值来进行.

并且在(unsigned __int64)0xF0000000 …

c types casting type-conversion

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

Visual Studio属性表:为什么缺少字符集?

我正在使用Visual Studio 2010 SP1.我注意到我可以向项目添加属性表,但我无法更改这些属性表中的字符集.我创建的任何属性表都缺少"字符集"选项.

任何人都可以解释为什么我不能使用属性表设置字符集?是否有一些禁止使用属性表无法设置的禁用属性列表?

谢谢

visual-studio-2010 propertysheet visual-studio visual-c++

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

C++匿名命名空间:变量初始化为0?

这里有一个相关的未回答的问题:
c ++ - 变量在未命名的命名空间中自动初始化为0?- 堆栈溢出

当我在CI中有一个全局函数指针时,可以将它声明为静态,并将其初始化为NULL并且仅对我的文件可用.在C++中,我将很多东西转换为匿名命名空间,但我很好奇他们是否拥有相同的保证.如果我在匿名命名空间中有一个函数指针,它会被初始化为null吗?

谢谢

c++ static

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

Inno Setup - 将Integer 652转换为浮点数给出6.52?

这可能是一个Pascal问题而不是Inno Setup问题.我怎么做的时候:

floatnum := 652;
Run Code Online (Sandbox Code Playgroud)

存储在浮点数中的实际值是6.5200000而不是652.000000?

更新:有人指出6.52实际上是652这让我感到困惑所以我想我应该更具体一点.这是我遇到的一些代码:

floatnum := 305 / 600;
Run Code Online (Sandbox Code Playgroud)

我预计floatnum会保持接近0.5083333但不会,而是持有5.08333325.这对我来说不合适.我错过了什么?

floating-point inno-setup

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