Compiles as C++ but not C (error: lvalue required as unary '&' operand)
Compiles as C++ but not C (error: lvalue required as unary '&' operand)
当我使用 C++ 而不是 C:
时,这一行编译
gmtime(&(*(time_t *)alloca(sizeof(time_t)) = time(NULL))); //make an lvalue with alloca
我对这种差异感到惊讶。甚至没有 C++ 的警告。
当我指定 gcc -x c
时,消息是:
playground.cpp:25:8: error: lvalue required as unary '&' operand
gmtime(&(*(time_t *)alloca(sizeof(time_t)) = time(NULL)));
^
这里的&
不就是地址运算符吗?为什么在 C 和 C++ 中不同?
虽然我可以在 C 中使用复合字面值,但是否仍然可以修改我的语法以使其在 C 和 C++ 中都能工作?
在 C11 6.5.16/3 中:
An assignment operator stores a value in the object designated by the left operand. An assignment expression has the value of the left operand after the assignment, but is not an lvalue.
在 C++14 5.17/1 中:
The assignment operator (=) and the compound assignment operators all group right-to-left. All require a modifiable lvalue as their left operand and return an lvalue referring to the left operand.
(早期版本的语言标准在每种情况下都指定了相同的内容)。
由于 address-of 运算符只能对左值进行运算,因此代码在 C++ 中是正确的,但在 C 中不正确。
关于问题"Is it possible to modify my syntax to make it work in both C & C++?"。这不是一个理想的目标;这两种语言是不同的,你应该决定你在写什么。这与尝试坚持适用于 C 和 Java.
的语法一样有意义
根据其他人的建议,您可以这样写:
time_t t = time(NULL);
gmtime(&t);
与您的原始代码相比有以下优势:
- 更简单,因此更容易理解和维护
- 不依赖于non-standard
alloca
函数
- 没有潜在的对齐冲突
- 不再使用内存,可能使用更少
当我使用 C++ 而不是 C:
时,这一行编译gmtime(&(*(time_t *)alloca(sizeof(time_t)) = time(NULL))); //make an lvalue with alloca
我对这种差异感到惊讶。甚至没有 C++ 的警告。
当我指定 gcc -x c
时,消息是:
playground.cpp:25:8: error: lvalue required as unary '&' operand
gmtime(&(*(time_t *)alloca(sizeof(time_t)) = time(NULL)));
^
这里的&
不就是地址运算符吗?为什么在 C 和 C++ 中不同?
虽然我可以在 C 中使用复合字面值,但是否仍然可以修改我的语法以使其在 C 和 C++ 中都能工作?
在 C11 6.5.16/3 中:
An assignment operator stores a value in the object designated by the left operand. An assignment expression has the value of the left operand after the assignment, but is not an lvalue.
在 C++14 5.17/1 中:
The assignment operator (=) and the compound assignment operators all group right-to-left. All require a modifiable lvalue as their left operand and return an lvalue referring to the left operand.
(早期版本的语言标准在每种情况下都指定了相同的内容)。
由于 address-of 运算符只能对左值进行运算,因此代码在 C++ 中是正确的,但在 C 中不正确。
关于问题"Is it possible to modify my syntax to make it work in both C & C++?"。这不是一个理想的目标;这两种语言是不同的,你应该决定你在写什么。这与尝试坚持适用于 C 和 Java.
的语法一样有意义根据其他人的建议,您可以这样写:
time_t t = time(NULL);
gmtime(&t);
与您的原始代码相比有以下优势:
- 更简单,因此更容易理解和维护
- 不依赖于non-standard
alloca
函数 - 没有潜在的对齐冲突
- 不再使用内存,可能使用更少