小编cto*_*tor的帖子

如果复合表达式中的多个操作数修改同一个对象,它是否是未定义的行为?

我依稀记得在复合表达式中的多个操作数修改同一个对象时,在某处读取它是未定义的行为.

我相信下面的代码中显示了这个UB的一个例子,但是我编译了g ++,clang ++和visual studio,所有这些都打印出相同的值,并且似乎无法在不同的编译器中产生不可预测的值.

#include <iostream>

int a( int& lhs ) { lhs -= 4; return lhs; }
int b( int& lhs ) { lhs *= 7; return lhs; }
int c( int& lhs ) { lhs += 1; return lhs; }
int d( int& lhs ) { lhs += 2; return lhs; }
int e( int& lhs ) { lhs *= 3; return lhs; }

int main( int argc, char **argv )
{
    int i = 100;
    int …
Run Code Online (Sandbox Code Playgroud)

c++ undefined-behavior language-lawyer unspecified-behavior c++11

27
推荐指数
3
解决办法
944
查看次数

键入安全枚举位标志

我想为我当前的问题使用一组位标志.这些标志(很好地)被定义为一部分enum,但是据我所知,当你OR从枚举中获得两个值时,OR操作的返回类型具有类型int.

我目前正在寻找的是一种解决方案,它允许位掩码的用户保持类型安全,因此我创建了以下重载 operator |

enum ENUM
{
    ONE     = 0x01,
    TWO     = 0x02,
    THREE   = 0x04,
    FOUR    = 0x08,
    FIVE    = 0x10,
    SIX     = 0x20
};

ENUM operator | ( ENUM lhs, ENUM rhs )
{
    // Cast to int first otherwise we'll just end up recursing
    return static_cast< ENUM >( static_cast< int >( lhs ) | static_cast< int >( rhs ) );
}

void enumTest( ENUM v )
{
}

int …
Run Code Online (Sandbox Code Playgroud)

c++ enums bitwise-operators c++03

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

为什么要在Ideone上编译?

好的,所以我在Ideone乱搞并意外地提交了这段代码,但令我惊讶的是它实际编译并运行输出值为0,这里.

#include <iostream>

using namespace std;

const int five(  )
{
        const int i = 5;
}

int main() {
        cout << five(  ) << endl;
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后我在Visual Studio中尝试了这一点,然而在Codepad上,两者都无法编译,因为five()没有返回值,正如人们所期望的那样.我的问题当然是,为什么这个在Ideone上编译正常,即使代码,我的理解是错误的,不应该编译.

c++

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

班级成员是否保证在记忆中是连续的?

我有一个包含许多函数指针的类,我想在构造对象时将它们全部初始化为NULL.为此,我计划在内存位置上使用memset,从第一个指针指向最后一个指针,但是我不确定这是否会在100%的时间内起作用.

如果这些函数指针在类中连续声明它们的内存位置也是连续的,那么它是否可以保证.我假设填充不会影响我正在尝试做的事情,因为任何填充字节也只会设置为NULL.

示例类实现

class C
{
private:
    void (*func1)();
    void (*func2)();
    void (*func3)();
    void (*func4)();
};
Run Code Online (Sandbox Code Playgroud)

c++

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

修改connect()超时时间

我做了一些搜索,似乎无法找到我正在寻找的答案,我能找到的唯一答案是使用select来查看套接字是否已经超时,这就是我已经在做的事情.

我想知道的是,无论如何要改变connect()超时之前的时间长度?我目前正在使用select()哪个返回errnoset,EINPROGRESS直到最终返回ETIMEDOUT.无论如何我可以改变这种ETIMEDOUT情况发生之前的时间吗?目前它发生在大约60秒后.我已经尝试调整传递给select()调用的超时值,但这只会影响超时之前的select()时间.

c c++ sockets

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

在mingw g ++ 4.7.2中,decltype未声明

出于某种原因或其他原因,尝试在mingw上使用G ++编译以下代码

#include <iostream>
#include <string>
#include <cctype>

int main( int argc, char **argv )
{
    std::string s( "Hello, World!" );

    decltype( s.size(  ) ) punct_cnt = 0;

    for ( auto c : s )
    {
        if ( ispunct( c ) )
            ++punct_cnt;
    }

    std::cout << punct_cnt << " punctuation characters in " << s << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

test.cpp: In function 'int main(int, char**)':
test.cpp:9:23: error: 'decltype' was not declared in this scope
test.cpp:9:25: error: expected ';' …
Run Code Online (Sandbox Code Playgroud)

c++ mingw g++ c++11

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

在同一台机器上运行客户端和服务器

我有一个使用UDP端口25565的客户端和服务器应用程序。为了在同一台机器上运行它们,因为只有一个应用程序可以将自己绑定到端口25565,这是否意味着我需要使用两个单独的端口进行传输应用程序之间的数据?

我想到的是以下——

客户端 -> 25565 -> 服务器

客户端 <- 25566 <- 服务器

这是唯一的解决方案还是有另一种处理方法?

c++ sockets networking network-programming winsock

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