草庐IT

c++ - 使用 union 在具有共同初始序列的两个结构之间进行转换是否合法且定义明确的行为(参见示例)?

我有一个带有公开面向结构A和内部结构B的API,并且需要能够将结构B转换为结构A。以下代码是否合法和明确定义的行为C99(和VS2010/C89)和C++03/C++11?如果是,请解释是什么使它定义明确。如果不是,那么在两个结构之间进行转换的最有效和跨平台的方法是什么?structA{uint32_tx;uint32_ty;uint32_tz;};structB{uint32_tx;uint32_ty;uint32_tz;uint64_tc;};unionU{structAa;structBb;};intmain(intargc,char*argv[]){Uu;u.b.x=1;u.b

c++ - 使用 union 在具有共同初始序列的两个结构之间进行转换是否合法且定义明确的行为(参见示例)?

我有一个带有公开面向结构A和内部结构B的API,并且需要能够将结构B转换为结构A。以下代码是否合法和明确定义的行为C99(和VS2010/C89)和C++03/C++11?如果是,请解释是什么使它定义明确。如果不是,那么在两个结构之间进行转换的最有效和跨平台的方法是什么?structA{uint32_tx;uint32_ty;uint32_tz;};structB{uint32_tx;uint32_ty;uint32_tz;uint64_tc;};unionU{structAa;structBb;};intmain(intargc,char*argv[]){Uu;u.b.x=1;u.b

c++ - "&a+1 > &a"会导致未定义的行为吗

c99/c++03是否保证&a+1>&a始终为真?例如,有一个(c-like)std::copy,并且inta=0;intb[9];std__copy(&a,&a+1,b);这总是有效吗? 最佳答案 是的,C99有一个特殊的措辞,表示在处理地址时,任何给定的对象a将像一个包含1个项目的数组,因此&a+1有效(§6.5.6/7):Forthepurposesoftheseoperators,apointertoanobjectthatisnotanelementofanarraybehavesthesameasapointertoth

c++ - "&a+1 > &a"会导致未定义的行为吗

c99/c++03是否保证&a+1>&a始终为真?例如,有一个(c-like)std::copy,并且inta=0;intb[9];std__copy(&a,&a+1,b);这总是有效吗? 最佳答案 是的,C99有一个特殊的措辞,表示在处理地址时,任何给定的对象a将像一个包含1个项目的数组,因此&a+1有效(§6.5.6/7):Forthepurposesoftheseoperators,apointertoanobjectthatisnotanelementofanarraybehavesthesameasapointertoth

c++ - C++ (GCC) 中的 C99 严格别名规则

据我了解,GCC在C++中支持其所有C99功能。但是C++代码中如何处理C99严格别名?我知道在不相关类型之间使用C进行强制转换不是严格混叠安全的,并且可能会生成不正确的代码,但是C++呢?由于严格别名不是C++标准的一部分(对吗?),GCC必须自己指定语义。我认为const_cast和static_cast在相关类型之间进行强制转换,因此它们是安全的,而reinterpret_cast可以打破严格的别名规则。这是正确的理解吗? 最佳答案 不,你可能混合了不同的东西。严格的别名规则与C99标准完全无关。严格的别名规则Root于自[标

c++ - C++ (GCC) 中的 C99 严格别名规则

据我了解,GCC在C++中支持其所有C99功能。但是C++代码中如何处理C99严格别名?我知道在不相关类型之间使用C进行强制转换不是严格混叠安全的,并且可能会生成不正确的代码,但是C++呢?由于严格别名不是C++标准的一部分(对吗?),GCC必须自己指定语义。我认为const_cast和static_cast在相关类型之间进行强制转换,因此它们是安全的,而reinterpret_cast可以打破严格的别名规则。这是正确的理解吗? 最佳答案 不,你可能混合了不同的东西。严格的别名规则与C99标准完全无关。严格的别名规则Root于自[标

c++ - 在 CMake 中强制使用 C99(使用 'for' 循环初始声明)

我一直在寻找一种可移植的方式来强制CMake启用编译器的C99功能,以避免例如以下gcc错误:error:‘for’loopinitialdeclarationsareonlyallowedinC99modefor(ints=1;sStepNumber;s++){^我也不想检查哪个编译器并附加如下内容:set(CMAKE_C_FLAGS"-std=c99")#thatwouldbebad所以我找到了这篇文章:EnablingC99inCMake以及相关的功能请求:0012300:CMakehasnocross-platformwaytoaskforC99.在这个Mantis错误中,我了

c++ - 在 CMake 中强制使用 C99(使用 'for' 循环初始声明)

我一直在寻找一种可移植的方式来强制CMake启用编译器的C99功能,以避免例如以下gcc错误:error:‘for’loopinitialdeclarationsareonlyallowedinC99modefor(ints=1;sStepNumber;s++){^我也不想检查哪个编译器并附加如下内容:set(CMAKE_C_FLAGS"-std=c99")#thatwouldbebad所以我找到了这篇文章:EnablingC99inCMake以及相关的功能请求:0012300:CMakehasnocross-platformwaytoaskforC99.在这个Mantis错误中,我了

c++ - C99 printf 格式化程序与 C++11 用户定义文字

这段代码:#define__STDC_FORMAT_MACROS#include#include#include#includeintmain(intargc,char**argv){uint64_tval=1234567890;printf("%"PRId64"\n",val);exit(0);}适用于C99、C++03、C++11accordingtoGCC4.5,但在C++11accordingtoGCC4.7.1上失败。在PRId64之前添加一个空格可以让GCC4.7.1编译它。哪个是正确的? 最佳答案 gcc4.7.1是正

c++ - C99 printf 格式化程序与 C++11 用户定义文字

这段代码:#define__STDC_FORMAT_MACROS#include#include#include#includeintmain(intargc,char**argv){uint64_tval=1234567890;printf("%"PRId64"\n",val);exit(0);}适用于C99、C++03、C++11accordingtoGCC4.5,但在C++11accordingtoGCC4.7.1上失败。在PRId64之前添加一个空格可以让GCC4.7.1编译它。哪个是正确的? 最佳答案 gcc4.7.1是正