在C ++中MyType(myVar)声明的重点是什么?

时间:2014-07-17 11:36:10

标签: 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;
    }

3 个答案:

答案 0 :(得分:14)

不确定。我甚至可以这样做:

int (main)()
{
}

括号用于在C和C ++中对事物进行分组。除分组外,它们通常不具有其他意义。函数调用/声明/定义有点特殊,但是如果你需要说服我们不应该在那里省略它们,那么只需看看Ruby,其中括号在函数调用中是可选的。

没有必要指出它。但有时能够在一些理论上不必要的括号中使用有助于使代码更容易阅读。当然不是你的特定例子,而不是我的。

答案 1 :(得分:3)

#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

声明中的括号主要用于它们在任何地方所做的相同目的,将所有应该在一起的事物分组,而不管语言的默认优先顺序如何。 当然,内部只有一个元素的括号相当于只键入该元素,除非括号是必需的(例如函数调用)。

答案 2 :(得分:2)

如果可以帮助它,C ++不会破坏向后兼容性。

它开发的C具有这种语法。所以C ++继承了它。

这种向后兼容性的副作用是令人烦恼的解析问题。他们没有证明足以证明破坏向后兼容性的理由。