C++中MyType(myVar)声明的意义何在
What is the point of MyType(myVar) declaration in C++?
在c++11标准中,我们可以用一种不同寻常的方式声明变量。我们可以将myVar
声明为int(myVar);
而不是int myVar
。这有什么意义?
#include <iostream>
using namespace std;
int main() {
int(myVar);
myVar = 1000;
cout << myVar << endl;
return 0;
}
UPD事实上,我问这个问题有一定的原因。当我们试图将一些代码从MSVC C++03移植到GCC C++11时,看起来很无辜的东西就停止了编译。以下是的示例
#include <iostream>
using namespace std;
struct MyAssert
{
MyAssert(bool)
{
}
};
#define ASSERT(cond) MyAssert(cond)
void func(void* ptr)
{
ASSERT(ptr); // error: declaration of ‘MyAssert ptr’
// shadows a parameter #define ASSERT(cond) MyAssert(cond)
}
int main()
{
func(nullptr);
return 0;
}
当然。我甚至可以做到:
int (main)()
{
}
括号用于在C和C++中对事物进行分组。除了分组之外,它们通常没有其他意义。函数调用/声明/定义有点特殊,但如果您需要说服我们不应该在那里省略它们,只需看看Ruby,在函数调用中括号是可选的。
这不一定有意义。但有时能够加上一些理论上不必要的括号有助于使代码更容易阅读。当然,在你的例子中没有,在我的例子中也没有。
#include <typeinfo>
#include <iostream>
int main(void)
{
int *first_var[2];
int (*second_var)[2];
std::cout << typeid(first_var).name() << std::endl;
std::cout << typeid(second_var).name() << std::endl;
return 0;
}
在我的机器上运行此程序会得到:
A2_Pi
PA2_i
声明中的括号大多与它们在任何地方所起的作用相同,将应该放在一起的东西分组,而不考虑语言的默认优先级顺序。当然,括号内只有一个元素就相当于只键入该元素,除非括号是强制性的(例如函数调用(。
C++不会破坏向后兼容性(如果有帮助的话(。
它是从C语言发展而来的。所以C++继承了它。
这种向后兼容性的一个副作用是令人烦恼的解析问题。事实证明,它们没有足够的烦恼来证明打破向后兼容性是合理的。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- 错误:未在此范围内声明'reverse'
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 为什么在定义函数之前先声明它
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- #ifdef和未声明的标识符
- 没有显式声明的int[]中的foreach
- 在基于范围的for循环中使用结构化绑定声明
- 在将变量声明为引用时,堆在释放后使用
- C++:无法访问声明的受保护成员
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 在函数内部的声明中初始化数组,并在外部使用它
- Visual Studio中的函数声明和函数定义问题
- c++类声明时,相同的例程,不同的成员变量类型
- C++中MyType(myVar)声明的意义何在