未定义的内部链接和未定义的符号错误

时间:2012-11-23 23:28:06

标签: c++ xcode

我尝试在Xcode上编译一个简单的程序并得到以下消息:

function<anonymous namespace>::Initialize' has internal linkage but is not defined

function<anonymous namespace>::HandleBadInput' has internal linkage but is not defined

Undefined symbols for architecture x86_64:
  "(anonymous namespace)::Initialize()", referenced from:
      _main in main.o
  "(anonymous namespace)::HandleBadInput()", referenced from:
      _main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

头文件如下所示:

#ifndef WJKErrorHandling
#define WJKErrorHandling

namespace WJKErrorHandling{

    void Initialize(void);
    int HandleBadInput(void);

}

#endif // defined(WJKErrorHandling)

实现文件如下所示:

#include <iostream>
#include "WJKErrorHandling.h"

namespace WJKErrorHandling{

    void Initialize(void){

        std::cin.exceptions(std::cin.failbit);
    }

    int HandleBadInput(void){

        std::cerr << "Input Error: wrong type?\n";
        std::cin.clear();

        char BadInput[5];
        std::cin >> BadInput;

        return 1;
    }

}

和main.cpp看起来像这样:

#include <iostream>
#include "WJKErrorHandling.h"


void Prompt (void){

    //Prompts the user to begin entering numbers

    std::cout << "Begin entering numbers: \n";
}

float GetNumber (void){

    std::cout << "Number: \n";
    float Number;
    std::cin >> Number;
    return Number;
    }

std::string GetString (void){

    std::cout << "String: \n";
    std::string String;
    std::cin >> String;
    return String;

}

int main()
{
    Prompt();
    WJKErrorHandling::Initialize();

    int ReturnCode = 0;

    try{

        float Number = GetNumber();
        std::cout << Number;
        std::string String = GetString();
        std::cout << String;

        std::cout << "SUCCESS!!!!\n";

    }
    catch(...){

        ReturnCode = WJKErrorHandling::HandleBadInput();
    }


    return ReturnCode;
}

到目前为止,我已尝试找到答案,但我还没有理解我找到的任何帖子。我是C ++的新手,所以非常感谢任何帮助!

3 个答案:

答案 0 :(得分:4)

您的#define Guard导致名称查找问题。

更改为以下样式应解决问题:

#ifndef WJK_ERROR_HANDLING_H
#define WJK_ERROR_HANDLING_H

答案 1 :(得分:1)

您还可以使用非标准但更惯用的#pragma once,根据其wikipedia page,所有主要编译器都支持它。

由于许多编译器都有优化识别包含防护,因此两者之间没有速度优势。对于我自己,我看到了#pragma once的以下优点:

  • 它只有一个含义(而定义用于不同的目的),不会与其他事物发生冲突(例如你的情况下的命名空间)。
  • 输入很少,很容易记住。
  • 由于输入错误(WJKERRORHANDLNG_H,ups和我失踪),你不会有错误,因为你把标题作为另一个的副本开始并且忘记更改包含警卫,这会给你相当讨厌的bughunting会话

答案 2 :(得分:0)

原来这是一个不好的包括后卫:

#ifndef WJKErrorHandling
#define WJKErrorHandling

因为您稍后尝试使用WJKErrorHandling作为命名空间,但宏会让它消失。

将您的包含保护更改为:

#ifndef WJKERRORHANDLING_H
#define WJKERRORHANDLING_H

这可能更具惯用性,不太可能与某些事物发生冲突。

相关问题