相关疑难解决方法(0)

C++代码可以在C++ 03和C++ 11中有效但是做不同的事情吗?

C++代码是否可以符合C++ 03标准和C++ 11标准,但根据编译的标准,可以做不同的事情吗?

c++ language-lawyer c++11 c++03

294
推荐指数
7
解决办法
2万
查看次数

增加在初始化列表中使用两次的变量 - 未定义的行为?

编辑:尚未回答 - 链接的问题是关于普通的r值,初始化列表是一个单独的,如果相关的概念.

这个语句定义得很好,或者在初始化列表中使用前缀增量运算符,对于在列表中出现两次的变量,未定义的行为?

struct T t = { i, ++i };
Run Code Online (Sandbox Code Playgroud)

我对ANSI C最感兴趣,但知道其他版本的C和/或C++是否有所不同也很有用.如果类似以下的类似结构是合法的:

struct T t = { i, i++ };

struct T t = { ++i, ++i };

struct T t = { i++, ++i };

struct T t = { i++, i++ };
Run Code Online (Sandbox Code Playgroud)

c c++ initializer undefined-behavior

16
推荐指数
3
解决办法
800
查看次数

initializer_list c ++ 11中的评估顺序

在下面的代码中是否需要f1在之前调用f2(反之亦然)或者是否未指定?

int f1();
int f2();

std::initializer_list<int> list { f1(), f2() };
Run Code Online (Sandbox Code Playgroud)

c++ c++11

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

程序执行没有在main()开始

我在C开发了很多年,现在才发现一个程序可以在main()函数之前执行代码.这是一个代码示例

int generateNum(){
    // Some malicious code here...
    return 5;
}

static int someArray[] = {generateNum(),generateNum()}  

int main(){
     // Some code here...
}
Run Code Online (Sandbox Code Playgroud)

该函数generateNum()之前被调用两次main().

我的问题是

  1. 谁调用generateNum()?我知道在Windows上它是crtexe()
  2. 这种行为是否在不同平台上标准化:Windows/Linux/Android/iOS?
  3. 如何获得有关此行为的更多信息?我想在谷歌搜索,但我不知道如何描述它.
  4. 我可以在generateNum()中做任何我想做的事吗?我的意思是,我可以调用malloc()吗?那fopen()和fwrite()怎么样?我可以打开套接字并通过UDP发送信息吗?最终我可以滥用这个功能甚至从它调用main():-)

c++

7
推荐指数
2
解决办法
387
查看次数

C ++ 11之前的初始化程序列表中是否存在同一变量的多个突变未定义的行为

考虑以下代码:

int main()
{
    int count = 0 ;
    int arrInt[2] = { count++, count++ } ;

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

如果我们使用clang -std=c++03它编译代码,则会产生以下警告(实时示例):

warning: multiple unsequenced modifications to 'count' [-Wunsequenced]
    int arrInt[2] = { count++, count++ } ;
                           ^        ~~
Run Code Online (Sandbox Code Playgroud)

我不是在提倡这样的代码,但是在另一个问题中出现了类似的代码,并且对于是否根据标准C ++ 11进行定义存在分歧。在C ++ 11中,根据初始化程序中的多个突变是否列出未定义的行为,此行为是定义良好的行为,并且如果我使用该警告,则该警告消失了。-std=c++11

如果我们看一下C ++ 11 之前的标准草案,它没有覆盖initializer-list的相同语言,那么似乎我们剩下的是Chapter 5 Expressions第4段:

除非另有说明,否则未指定各个运算符的操作数和各个表达式的子表达式的求值顺序以及发生副作用的顺序。57)在上一个序列点与下一个序列点之间,标量对象最多应通过表达式的计算修改其存储值。此外,应仅访问先验值以确定要存储的值。对于完整表达式的子表达式的每个允许的排序,都应满足本段的要求;否则,行为是不确定的。

为了使这个未定义,我们似乎必须将其解释count++, count++ …

c++ undefined-behavior initializer-list language-lawyer

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

在同一行使用变量时的预自增运算符

我相信我想做的事情可能是有效的,因为它在两种情况下都用逗号分隔(不是典型的作业),但我不确定并且搜索不会显示有关这两个的任何内容具体情况。

在这两种情况下,我都使用变量作为两个并行数组的索引。

int a[3] = {10, 20, 30};
int b[3] = {20, 40, 60};
Run Code Online (Sandbox Code Playgroud)

情况#1:初始化数组的结构

struct testStruct {
     int t1;
     int t2;
};
int i = 0;
testStruct test = {a[++i], b[i]}
Run Code Online (Sandbox Code Playgroud)

最终行的预期结果:test = {20, 40}

情况#2:将数组中的特定值作为函数参数传递

void testFunc(int t1, int t2) {
    // do stuff
}
int i = 0;
test(a[++i], b[i]);
Run Code Online (Sandbox Code Playgroud)

最终行的预期结果:test(20, 40)

这是有效的代码吗?如果是,它在所有编译器中都有效吗?

结果是我期望的吗?如果是这样,是因为数组还是因为逗号?

谢谢!

c++ undefined-behavior pre-increment

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

为什么这种未定义的行为?

这是示例代码:

X * makeX(int index) { return new X(index); }
struct Tmp {
    mutable int count;
    Tmp() : count(0) {}
    const X ** getX() const { 
        static const X* x[] = { makeX(count++), makeX(count++) };
        return x; 
    }
};
Run Code Online (Sandbox Code Playgroud)

这将在静态数组构造中报告CLang build 500上的Undefined Behavior.为了简化这篇文章,计数不是静态的,但它不会改变任何东西.我收到的错误如下:

test.cpp:8:44:警告:对'count'的多次无序修改[-Wunsequenced]

c++ clang undefined-behavior

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