【问题标题】:C++ variable namingC++ 变量命名
【发布时间】:2014-02-26 19:20:20
【问题描述】:

以下 C++ 代码在 Visual Studio 中编译:

void main() {
    int f() = 5;
std::cout << typeid(f()).name();    // int
}

而且,据我所知,它不适用于 Linux 中的 gcc 或 g++(我尝试在运行 Ubuntu 的虚拟机和运行 Mint 的物理机上编译它,两者都有最新的更新) .

但是,变量 f() 不能在任何地方使用。以下代码:

void main() {
    int f() = 5;
    cout << f();
}

给出这个错误:

error LNK2019: unresolved external symbol "int __cdecl f(void)" (?f@@YAHXZ) referenced in function _main
error LNK1120: 1 unresolved externals

我想知道它为什么起作用,什么是 f(),以及,如果这是一个有效的命名,如何使用它。

编辑

它适用于 Visual Studio 2013 和 Visual C++ 2010。

PS:我没有尝试定义函数或声明变量或任何东西。我听说过这种行为,但找不到原因。

调试器似乎没有将 f() 识别为变量(正如预期的那样); 此外,证明它在 VS2013 下有效:D。

【问题讨论】:

  • 标识符不能包含标点符号。
  • int f() 被解释为不带参数并返回int 的函数声明。你不能给它赋值。而且由于它没有定义(仅声明),MSVC 链接器无法解析它。我不知道为什么它首先会编译。
  • 初学者应该使用int main()
  • 同样重要的是:哪个版本的 VS 可以让你这样做?
  • @juanchopanza 我听说过这个,我只是把它放在一个空项目中以确保它有效。

标签: c++ variables visual-c++ syntax naming


【解决方案1】:
 int f() = 5;

您偶然发现了“最令人烦恼的解析”。 编译器从中得到的(也根据你得到的链接器错误)是一个函数声明/指针。可以解析为函数声明的所有内容都将是。 这段代码声明了一个名为 f 的函数,它不接受任何参数并返回一个 int。我的猜测是 Visual Studio 假设这个函数现在位于内存地址 5。

你可能想要使用 f 作为变量,所以省略括号:

int f = 5;

【讨论】:

  • 是的,但它不是“最烦人的解析”。这是一个具体的歧义 - 这里没有任何歧义,它只是简单的错误en.wikipedia.org/wiki/Most_vexing_parse
  • 所以它编译是因为它认为我声明了一个函数,当它试图访问那个函数时,它意识到没有函数?
  • @tase92 这正是发生的事情。
  • 虽然它对 C++ 来说并没有歧义,但它是为 OP 设计的。出现错误的原因是一样的。
【解决方案2】:

int f() = 5; 的语法无效。

我假设你想要这样的东西。

int f() { return 5; }

int main()
{
    std::cout << f();
}

【讨论】:

    【解决方案3】:

    那是因为

         int f() = 5; 
    

    不是变量。要在 C++ 中声明整数变量,不能包含括号。因此,正确的代码是

        int f = 5;
    

    所以总的完整代码是

        void main() 
        {
           int f = 5;
           cout << f;
        }
    

    一般也是 无效的主要() 不再使用,它​​是

        int main()
        { 
           int f = 5;
           cout << f;
           return 0;
        } 
    

    相反。这取决于您的编译器的年龄,但这是现在普遍接受的做事方式。

    【讨论】:

      猜你喜欢
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 2021-06-22
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      相关资源
      最近更新 更多