- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有以下结构:
struct myStruct {
long int mem0;
int mem1;
int mem2;
// -- Place 1 --
short int sh;
-- Place 2 --
char array[5];
// -- Place 3 --
};
我尝试按如下方式初始化它:
struct myStruct ms1 = {
mem0 : 124,
mem1 : 120,
mem2 : 99,
mem3 : 12,
}; // Line 36
如果我将以下任何一行放在位置 2 或位置 3
char mem3;
int mem3;
我收到以下错误:
Azulejo-Main-Engine-1v2-4% g++ test2.cpp -o test2
test2.cpp: In function ‘int main()’:
test2.cpp:36:5: sorry, unimplemented: non-trivial designated initializers not supported
};
^
Azulejo-Main-Engine-1v2-4%
但是,如果我将它放在位置 1,我的程序会编译(并按预期执行)。你能解释一下为什么会这样吗?
我正在尝试将 C 代码移植到 C++ 中。如何防止这种错误?我无法控制代码使用的结构声明。
Azulejo-Main-Engine-1v2-4% g++ --version
g++ (GCC) 5.2.0
最佳答案
"sorry, unimplemented: <...>"始终意味着编译器尚未更新以允许这样做。这与将来是否允许,标准是否允许,甚至是否有意义无关。
如评论中所述,这不是有效的 C++,这是一个编译器扩展。您可以通过限制自己使用有效的 C++ 来避免此类问题。如果您将 -pedantic
传递给它,GCC 将诊断这个和许多其他扩展。旗帜。如果您将 -pedantic-errors
传递给它,它会将此类扩展视为硬错误。旗帜。如果您随后发现您正在编写不可移植的 C++,请更新您的代码以使其可移植,方法是:
struct myStruct ms1 = {
124,
120,
99,
12
};
这需要您放置 mem3
在 mem2
之后, 或通过
struct myStruct ms1 {};
ms1.mem0 = 124;
ms1.mem1 = 120;
ms1.mem2 = 99;
ms1.mem3 = 12;
不需要任何特定位置的 mem3
,或通过向您的 myStruct
添加构造函数服用mem0
... mem3
作为参数。
有关此扩展复杂性的一些额外细节:
C++ 中的结构初始化通常以字段声明的顺序发生。这使得处理异常变得相当容易:可以以相反的顺序销毁字段。如果尚未构建所有字段,则从最后一个已构建的字段开始销毁。
如果允许以任意顺序初始化字段,那么销毁就会变得复杂。鉴于 struct myStruct ms1 { mem1: f(), mem0: g() };
, 如果 g
抛出异常,然后mem1
已经初始化,需要销毁,没有 mem0
也被破坏,或者编译器重新排列初始化器,意思是 g()
在 f()
之前被调用.前者很难在编译器中得到正确的结果,后者非常不直观。
可以为普通可破坏的字段创建一个特殊的异常(exception),当字段被销毁时不需要运行用户代码,但它尚未实现。
如果你放置 mem3
在mem2
之后, 那么问题就避免了:初始化的顺序与字段顺序完全匹配。
关于c++ - 导致 "non-trivial designated initializers not supported"错误的结构成员顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33735608/
我收到多行错误,指出它有重复的类 Duplicate class android.support.v4.accessibilityservice.AccessibilityServiceInfoCom
我的项目昨天运行良好,今天却出现以下错误。请帮忙。 出了什么问题:无法解析配置“:app:debugCompileClasspath”的所有文件。 Could not find support-v4.
错误:配置项目“:app”时出现问题。 Could not find support-v4.jar (com.android.support:support-v4:24.0.0). Searched
我正在使用 react-native-webrtc 运行示例应用程序模块。我正在尝试在 android 中运行该应用程序,但出现这样的错误... * What went wrong: A probl
错误:配置项目“:app”时出现问题。 Could not find support-v4.jar (com.android.support:support-v4:24.0.0). Searched
我克隆了我的项目并使用 Android studio 打开,但构建失败并出现以下错误并且同一个项目在其他项目上运行良好。 出了什么问题:无法解析配置“:app:flavorUnsignedReleas
我正在运行示例应用程序......我正在使用 this模块.....但是我收到这样的错误... FAILURE: Build failed with an exception. * What went
我有一个 Ionic 项目,在升级到 OSx Mojave 后,出于某种原因不再构建。 该项目基于 Ionic 3 构建。 我有 Cordova CLI 7.0.0 当我运行时 ionic cordo
我有一个 Ionic 项目,在升级到 OSx Mojave 后,出于某种原因不再构建。 该项目基于 Ionic 3 构建。 我有 Cordova CLI 7.0.0 当我运行时 ionic cordo
添加 Android 平台(ionic cordova platform add android)后,我构建了我的 Ionic 项目(ionic cordova build android),但出现错
这个问题在这里已经有了答案: Manifest merger failed : Attribute application@appComponentFactory - Androidx (14 个答
关于我的 Gradle 文件中的以下“complie”: dependencies { compile 'com.android.support:support-v4:25.3.1' }
有些困惑。 我想更频繁地使用@supports 但是...我不关心浏览器如何看待它。希望您能说清楚,如果可以的话谢谢您。 如果浏览器本身不理解@supports,它如何计算@support 'not'
我刚刚升级到 Dart 2 和最新版本的 Flutter,现在我无法构建我的应用程序。我在互联网上环顾四周,但仍然不明白为什么会发生这种情况。 我得到的错误是: FAILURE: Build fail
我正在学习 Firebase,但由于以下错误而陷入困境: Error:Failed to resolve: com.android.support:customtabs:25.4.0 Error:Fa
我在构建本周时出于某种原因尝试使用Cordova进行项目时遇到问题: cordova build android gradle获取com.android.support:support alpha而不
对应的androidx是什么com.android.support:support-compat 的图书馆实现push notifications ? 他们说here它是 androidx 的一部分,
我正在尝试为我的应用设置插桩单元测试。并且我已根据以下开发者站点链接添加了依赖项。 https://developer.android.com/training/testing/unit-testin
当我想使用 Proguard 规则生成签名的 APK(发布)时,我收到了以下错误消息: Cannot find a version of 'com.android.support:support-an
这个问题在这里已经有了答案: Failed to resolve: com.android.support:appcompat-v7:26.0.0 (14 个答案) Failed to resolv
我是一名优秀的程序员,十分优秀!