0

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 ++を初めて使用するので、どんな助けでも大歓迎です!

4

3 に答える 3

1

非標準ですが、より慣用的な を使用することもできます。ウィキペディアのページ#pragma onceによると、すべての主要なコンパイラでサポートされています。

多くのコンパイラにはインクルード ガードを識別するための最適化機能があるため、両者の間に速度上の利点はありません。私自身、 の次の利点を確認しています#pragma once

  • それは1つの意味しか持たず(定義は異なる目的を果たしますが)、他のもの(たとえば、あなたの場合の名前空間)と衝突しません。
  • 入力が少なく、覚えやすいです。
  • タイプミス ( 、 ups 、および I が欠落している) によるエラーは発生しません。これWJKERRORHANDLNG_Hは、ヘッダーを別のコピーとして開始し、インクルード ガードを変更するのを忘れたため、厄介なバグハンティング セッションが発生するためです。
于 2012-11-24T08:02:49.697 に答える