C++ 中,包含一个有命名空间的文件两次会发生错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 中,包含一个有命名空间的文件两次会发生错误相关的知识,希望对你有一定的参考价值。

如果这个命名空间里有直接声明非 static 修饰的变量的话,就会出错
例如
---------文件: a.h
namespace a

int aa;


---------文件: a.cpp
#include "a.h"

--------main文件: Main.cpp
#include "a.h"

===========================
一运行就会提示两个错误:
int a::aa 已经定义过
找到一个或多个重定义符号

aa 用 static 修饰,或者下面两个文件任意去掉一个包含后 就不会报错了

这个错是什么原因?

参考技术A

你把一个全局变量的申明放到了头文件里面,你因该在a.cpp里面申明

namespace a

    int aa;

然后在 a.h里面申明

namespace a
    extern int aa;

并且a.cpp中不再include头文件a.h

参考技术B 头文件重复包含了,经过预编译展开时候,在编译的时候编译器认为定义了两次。在做多文件处理时,一般要在文件开头加上条件编译,防止重复添加同样的部分。追问

#pragma once 是这个吗?加了一样的情况

追答

不是。是
#ifndef __A
#define __A
……//文件内容
#endif

错误“命名空间不直接包含字段或方法等成员”

【中文标题】错误“命名空间不直接包含字段或方法等成员”【英文标题】:Error "A namespace does not directly contain members such as fields or methods" 【发布时间】:2010-01-19 01:01:30 【问题描述】:

我正在尝试构建我的 C# 项目,但收到错误消息“命名空间不直接包含字段或方法等成员”。它正在标记 app.config 文件的第一个字符(小于号)。

我检查了我的所有文件中是否存在直接位于命名空间内的变量或函数的位置 - 什么也没找到。 app.config 看起来不错。

Google 让我失望了,我要抓狂了。什么可能导致此错误?

【问题讨论】:

您的 app.config 是否与实际的源文件混淆了? 【参考方案1】:

数字!一旦我终于崩溃并提出我找到答案的问题......

app.config 文件属性部分(不知何故)列出了应设置为“无”的“编译”的构建操作。

它到底是如何改变的?我知道我没有改变它。呜呜呜……

哦,好吧,至少它现在正在建设中。希望别人能从我的脱发中受益。

【讨论】:

是的,你做到了。现在,你昨天在哪里?! 因为其他一些愚蠢的问题而扯掉我的头发。这些课程大部分都是从第一手经验中学到的:/ 我的头发又长回来了,谢谢伙计! @BoltBait(之前的螺栓?) 如果任何不应该编译的东西切换到 Build Action = Compile,而不仅仅是 app.config,就会发生这种情况。在我们的例子中,它是一个 LESS 文件,具有讽刺意味的是,它在 Web Essentials 中是“编译”的,但在 Visual Studio Build Action 中“编译”时会爆炸。 如果您将文件创建为.cs,然后将其重命名为.ts,则打字稿也会发生这种情况【参考方案2】:

我设法重现了错误。

检查 app.config 文件的属性。 Build Action 应该是 None,而不是 Compile

【讨论】:

【参考方案3】:

当您尝试将字段或成员直接添加到命名空间时会发生此错误。鉴于它指向 app.config,VS 可能处于错误状态。尝试关闭并重新打开 Visual Studio,看看错误是否消失。

尝试重建并将生成输出窗口中的结果发布到您的问题中失败。

【讨论】:

【参考方案4】:

我这样解决了:右键单击.axml文件->构建操作->AndroidResource (xamarin 工作室)

【讨论】:

【参考方案5】:

我有同样的错误。检查 app.config 是否设置为 none,那里没有问题。经过 30 分钟的检查和重新检查后,我重新启动了 VS,然后就完成了。它通常可以解决 90% 的不合逻辑错误。叹息。

【讨论】:

【参考方案6】:

我的网站后面的代码也有类似的问题。 这个问题原来是一个额外的右括号,导致我的课程在 page_load() 之后立即结束。总是检查像这样的愚蠢的语法错误。

【讨论】:

【参考方案7】:

我在使用 XML 文件时遇到了同样的问题。这是由于 .net 编译器试图编译这个 xml,它只用于 DATA 目的,因此不需要编译。

修复:转到此文件的属性并将构建操作从编译更改为内容。

谢谢

【讨论】:

【参考方案8】:

在我的例子中,我错误地在控制器类之外放置了一个新函数。 这是我在 ASP.NET MVC 中出现此错误的代码。

public class HomeController : Controller

    public class HomeController : Controller
    
        // GET: Home
        public ActionResult Index()
        
            return View();
               
    

    [HttpPost]
    public string Insert(string name, string age, string standard, string percent, string address, string status)
    
        //some code
        return "value";
    

应该是这样的:

public class HomeController : Controller

    public class HomeController : Controller
    
        // GET: Home
        public ActionResult Index()
        
            return View();
        

        [HttpPost]
        public string Insert(string name, string age, string standard, string percent, string address, string status)
        
            //some code
            return "value";
               
            

【讨论】:

以上是关于C++ 中,包含一个有命名空间的文件两次会发生错误的主要内容,如果未能解决你的问题,请参考以下文章

如果你在同一个集合上调用同一个迭代器两次会发生啥?

C++ 里 delete 指针两次会怎么样?

C++:“类命名空间”? [复制]

C++ 仅头文件库避免“使用命名空间”污染

C++ 项目相关知识命名空间

窗体头文件中的“错误 C2653:系统不是类或命名空间名称”,Visual C++