草庐IT

行为树

全部标签

c++ - 将 C 与 C++ 链接是否可以避免在 C 中合法但在 C++ 中不合法的未定义行为?

如果您有一个使用C编译器编译的C文件,并且为C而定义了C而不是C++的行为,您能否将它与C++文件链接并且没有未定义的行为?在blah.c(编译为C的文件)中structx{intblah;charbuf[];};externchar*get_buf(structx*base);externstructx*make_struct(intblah,intsize);blah_if.hextern"C"{structx;char*get_buf(structx*base);structx*make_struct(intblah,intsize);}some_random.cpp(使用C++

c++ - 将 C 与 C++ 链接是否可以避免在 C 中合法但在 C++ 中不合法的未定义行为?

如果您有一个使用C编译器编译的C文件,并且为C而定义了C而不是C++的行为,您能否将它与C++文件链接并且没有未定义的行为?在blah.c(编译为C的文件)中structx{intblah;charbuf[];};externchar*get_buf(structx*base);externstructx*make_struct(intblah,intsize);blah_if.hextern"C"{structx;char*get_buf(structx*base);structx*make_struct(intblah,intsize);}some_random.cpp(使用C++

c++ - i = i++ 的行为真的没有定义吗?

PossibleDuplicate:Couldanyoneexplaintheseundefinedbehaviors(i=i+++++i,i=i++,etc…)根据c++标准,i=3;i=i++;将导致未定义的行为。如果它可以导致多个结果,我们使用术语“未定义的行为”。但是这里,无论求值顺序如何,i的最终值都是4,所以这不应该叫“未指定行为”吗? 最佳答案 短语,“...无论评估顺序如何,i的最终值都是4...”是不正确的。编译器可以发出等价的:i=3;inttmp=i;++i;i=tmp;或者这个:i=3;++i;i=i-1;或

c++ - i = i++ 的行为真的没有定义吗?

PossibleDuplicate:Couldanyoneexplaintheseundefinedbehaviors(i=i+++++i,i=i++,etc…)根据c++标准,i=3;i=i++;将导致未定义的行为。如果它可以导致多个结果,我们使用术语“未定义的行为”。但是这里,无论求值顺序如何,i的最终值都是4,所以这不应该叫“未指定行为”吗? 最佳答案 短语,“...无论评估顺序如何,i的最终值都是4...”是不正确的。编译器可以发出等价的:i=3;inttmp=i;++i;i=tmp;或者这个:i=3;++i;i=i-1;或

c++ - 这个 C++ 成员初始化行为是否定义良好?

假设我们有一个类B,它有一个默认初始化为42的member。此类知道如何打印其member的值(它在构造函数中这样做):structB{B():member(42){printMember();}voidprintMember()const{std::cout然后我们添加一个类A,它接收一个对B的const引用并要求B打印它的值:structA{A(constB&b){b.printMember();}};最后我们添加另一个类Aggregate,它聚合了一个A和一个B。棘手的部分是A类型的对象a是在对象b类型B之前声明的,然后是>a使用对b的(尚未生效的?)引用进行初始化:struct

c++ - 这个 C++ 成员初始化行为是否定义良好?

假设我们有一个类B,它有一个默认初始化为42的member。此类知道如何打印其member的值(它在构造函数中这样做):structB{B():member(42){printMember();}voidprintMember()const{std::cout然后我们添加一个类A,它接收一个对B的const引用并要求B打印它的值:structA{A(constB&b){b.printMember();}};最后我们添加另一个类Aggregate,它聚合了一个A和一个B。棘手的部分是A类型的对象a是在对象b类型B之前声明的,然后是>a使用对b的(尚未生效的?)引用进行初始化:struct

c++ - a = 0; b = (a++, a + 1) ;未定义的行为(UB)?

看简单的例子:inta=0;intb=(a++,a+1);//resultofbisUBorwelldefined?(c++03).这在c++11/c++14中有所改变? 最佳答案 结果定义明确,从C++98开始。逗号运算符在a的写入和第二次读取之间引入了一个序列点(或后来的C++中的“排序前”关系),我看不出有任何其他潜在原因未定义的行为。 关于c++-a=0;b=(a++,a+1);未定义的行为(UB)?,我们在StackOverflow上找到一个类似的问题:

c++ - a = 0; b = (a++, a + 1) ;未定义的行为(UB)?

看简单的例子:inta=0;intb=(a++,a+1);//resultofbisUBorwelldefined?(c++03).这在c++11/c++14中有所改变? 最佳答案 结果定义明确,从C++98开始。逗号运算符在a的写入和第二次读取之间引入了一个序列点(或后来的C++中的“排序前”关系),我看不出有任何其他潜在原因未定义的行为。 关于c++-a=0;b=(a++,a+1);未定义的行为(UB)?,我们在StackOverflow上找到一个类似的问题:

c++ - *&++i 会在 C++03 中导致未定义的行为吗?

在anotheranswer据说在C++11之前,其中i是一个int,然后使用表达式:*&++i导致未定义的行为。这是真的吗?关于另一个答案,评论中有一些讨论,但似乎没有说服力。 最佳答案 问*&++i本身是否有UB是没有意义的。延迟不一定访问i的存储值(之前的或新的),正如您可以通过使用它作为引用的初始化表达式看到的那样。只有在涉及右值转换(在这种情况下使用)时,才有任何问题需要讨论。然后,由于我们可以使用++i的值,我们可以使用*&++i的值,但注意事项与+完全相同+i.原来的问题本质上是i=++i,和i=*&++i是一样的。这

c++ - *&++i 会在 C++03 中导致未定义的行为吗?

在anotheranswer据说在C++11之前,其中i是一个int,然后使用表达式:*&++i导致未定义的行为。这是真的吗?关于另一个答案,评论中有一些讨论,但似乎没有说服力。 最佳答案 问*&++i本身是否有UB是没有意义的。延迟不一定访问i的存储值(之前的或新的),正如您可以通过使用它作为引用的初始化表达式看到的那样。只有在涉及右值转换(在这种情况下使用)时,才有任何问题需要讨论。然后,由于我们可以使用++i的值,我们可以使用*&++i的值,但注意事项与+完全相同+i.原来的问题本质上是i=++i,和i=*&++i是一样的。这