我在C中的代码编译和正常工作,我想在C++中使用类似的代码:
static const char* aTable[12] = {
[4]="seems",
[6]=" it ",
[8]="works",};
int main(){
printf("%s%s%s", aTable[4],aTable[6],aTable[8]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我把它放在一个.c
文件中,并编译gcc
它的工作原理.但是,如果我把它放在一个.cpp
文件中并用它编译g++
,我会得到以下错误:
test_cpp.cpp:5:3: error: expected identifier before numeric constant
test_cpp.cpp:5:4: error: type '<lambda>' with no linkage used to declare function 'void<lambda>::operator()() const' with linkage [-fpermissive]
test_cpp.cpp: In lambda function: test_cpp.cpp:5:5: error: expected '{' before '=' token
test_cpp.cpp: At global scope: test_cpp.cpp:5:5: warning: lambda expressions only available with
-std=c++0x or -std=gnu++0x [enabled by default]
test_cpp.cpp:5:6: …
Run Code Online (Sandbox Code Playgroud) union A{
int a;
int b;
};
int main(){
A u = {.a = 0};
int r = u.b; // #1 Is this UB?
}
Run Code Online (Sandbox Code Playgroud)
[class.union] 说
在联合中,如果非静态数据成员的名称引用其生命周期已开始且尚未结束的对象 ([basic.life]),则该非静态数据成员处于活动状态。联合类型对象的最多一个非静态数据成员在任一时刻可以是活动的,即任一时刻联合体中最多可以存储一个非静态数据成员的值。
在此示例中,仅A::a
处于活动状态,然后 [basic.life] p7 表示
如果出现以下情况,则程序具有未定义的行为:
- 左值用于访问对象,或者
#1
尝试访问生命周期尚未开始的对象。此访问是否会导致 UB,如果是,此要求是否过于严格?
顺便说一句,C 标准在此示例中是否提出了相同的要求?或者说,在这种情况下,C 有更宽松的要求吗?
在C标准中,我找到了一个注释,上面写着
如果用于读取联合对象内容的成员与最后用于在对象中存储值的成员不同,则该值的对象表示形式的适当部分将被重新解释为新类型中的对象表示形式,如下所述6.2.6(有时称为类型双关的过程)。这可能是非值表示。
这意味着它在 C 中是允许的。但是,https://eel.is/c++draft/diff.iso
除了上面列出的差异之外,子条款 [diff.iso] 按本文档的章节列出了 C++ 和 ISO C 之间的差异。
没有指出差异。
gcc 4.9现在支持n3696(具有自动存储持续时间的运行时大小的数组).n3662说:
在具有自动存储持续时间的N3497运行时大小的数组中,Jens Maurer建议使用运行时绑定的数组.这些数组是std :: dynarray,因为普通的固定大小数组是std :: array.
在这个邮件列表中,Jonathan Wakely说:
我们应该在手册中添加一个C++ 14状态表,但同时这里是库状态的快速摘要.
...
缺少这些:
- N3672添加实用程序类以表示可选对象的提议
- N3655 TransformationTraits Redux
- N3662 C++动态数组
- N3644空前向迭代器
特征一个很简单,但有点乏味,迭代器可能只影响调试模式,但其他两个是重要的工作.是否有人打算继续工作?
但是,n3662还说:
我们建议为数组定义一个新的工具,而不是采用C可变长度数组,其中元素的数量在构造时被绑定.我们将这些动态数组称为dynarray.
我似乎无法dynarray
在gcc
页面上使用快速CTRL + F. 所以dynarray
即将实施,并将variable length arrays
留下或将消失?