"Expected unqualified-id before 'namespace'"错误

"Expected unqualified-id before 'namespace'" error

本文关键字:错误 namespace Expected unqualified-id before      更新时间:2023-10-16

我有下面一段看似无害的代码:

#ifndef UI_H
#define UI_H
#include <string>
namespace ui
{
    //Displays the main menu, showing loaded vocabulary cards
    //
    //Returns upon completion of display
    void displayMainMenu();
    //...More code like the above, just comments followed by functions
}
#endif

给我这个错误信息:

filepath/ui.h:6: error: expected unqualified-id before 'namespace'

我在这里做错了什么?

跟踪这类错误的一种方法是从头开始:

#include "filepath/ui.h"
int main () { return 0; }

可以编译吗?(这与您提供的ui.h的一小段代码一起工作得很好。)

像这样的错误通常是由于在前面的一些类声明中缺少分号引起的。所以让我们试着强制这个问题:
struct Foo { int foo; } // Note the missing semicolon after the close brace.
#include "filepath/ui.h"
int main () { return 0; }

这当然不会编译干净。我得到一个复杂的包含路径跟踪,从我的testmain.cpp到你的filepath/ui.h到string…最终得到

/usr/include/i386/_types.h:37: error: two or more data types in declaration of '__int8_t'

所以这不是错误,但是缺少分号肯定会造成混乱。您的错误不是在<string>的内部深处产生的,所以在尝试重新创建错误之前,让我们将测试程序设置为#include <string>:

#include <string>
struct Foo { int foo; } // Note the missing semicolon after the close brace.
#include "filepath/ui.h"
int main () { return 0; }

错误信息是

In file included from testmain.cpp:5:
filepath/ui.h:6: error: expected unqualified-id before 'namespace'

就是这样。因此,在filepath/ui.h之前#包含的其他一些头文件有一个格式不正确的类声明。

附录
有时使用不同的编译器会有所帮助。对于这种常见的编程错误,c++的处理方式非常糟糕。用clang编译上面的代码会得到

testmain.cpp:4:2: error: expected ';' after struct

所以,tada, clang已经把注意力集中在这个问题上了。

发生的事情是,当编译器遇到麻烦时,它会对你的代码进行一些修复,使其语法正确。编译器错误消息基于此自动更正。注意:这种自动更正通常是一件非常好的事情。如果没有它,编译器将不得不在第一个错误时关闭。由于程序员不可避免地会犯不止一个错误,因此一次找出一个错误将是非常痛苦的。

我一点也不知道g++应用了什么愚蠢的纠正来修复丢失的分号问题,除了不添加明显丢失的分号。Clang添加了缺少的分号,这就是它抱怨的地方。

这个文件是从哪里包含的。文件没有任何问题你张贴;我怀疑正在发生的是包含它已经包含了<string>(所以这个包含不做任何事情),并且

在包含您的文件之前立即缺少;

这太奇怪了。是否有其他任何#定义的UI_H(这应该不会引起问题,但谁知道呢),或ui ?

同样的事情发生在#pragma一次(假设你的编译器支持它)?

您是否真的对文件进行了配对,以便所有其他代码都被注释掉?

(抱歉发布了更多的问题而不是答案)

我从谷歌搜索到这里。如果有人因为同样的错误进入这个页面,如果你试图在类范围内定义一个命名空间别名,你也会得到这个错误。

的例子:

namespace SomeLongNamespaceName { }
class SomeClass {
    namespace X = SomeLongNamespaceName; // This is illegal and will give the
                                         // compiler error from this question
};

更多信息在这里:c++命名空间别名在整个类范围

name"在我的例子中是一个错误。期望:' namespace '前的unqualified-id在文件顶部的一个头文件的类声明内的命名空间。所以我需要在最后的'}'之后添加额外的分号。因此,如'};;;;'将做