2011-11-11 16 views
-1

私は2つのファイルgrabURL.cppとgrabURL.hppを持っています。 gccで両方をコンパイルすると、複数の定義エラーが発生します。Cで多重定義エラー

grabURL.cpp

#include "grabURL.hpp" 
size_t buffer(void *ptr, size_t size, size_t nmemb, void *stream) { 
      int numbytes = size*nmemb; 
      char lastchar = *((char *) ptr + numbytes - 1); 
     *((char *) ptr + numbytes - 1) = '\0'; 
      ret.append((char *)ptr); 
      ret.append(1,lastchar); 
     *((char *) ptr + numbytes - 1) = lastchar; 
    return size*nmemb; 
} 
void grabURL(std::string url, std::string *theRet){ 
    curl_easy_setopt(curl,CURLOPT_URL,url.c_str()); 
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION, buffer); 
res = curl_easy_perform(curl); 
*theRet = ret; 
} 

grabURL.hpp:

#ifndef CURLURLGRAB_HPP 
#define CURLURLGRAB_HPP 
#include <string> 
#include <curl/curl.h> 
CURL * curl; 
CURLcode res; 
std::string ret; 
size_t buffer(void *ptr, size_t size, size_t nmemb, void *stream); 
void grabURL(std::string url,std::string* theRet); 

#endif 

私は私が間違っているの何見当がつかない、私は私が正しくIFNDEFことをしたと思いました。正確に何が間違っていますか?あなたのヘッダファイル内

+0

* exact *エラーメッセージとは何ですか? –

+0

g ++ main.cpp grabURL.cpp -o test -lcurl /tmp/cceVAPGI.o:(bss+0x0): 'curl 'の複数定義 /tmp/ccC6uR4k.o:(.bss+0x0):最初にここで定義されている /tmp/cceVAPGI.o:(.bss+0x8): 'res 'の多重定義 /tmp/ccC6uR4k.o:(.bss+0x8):最初にここに定義されています /tmp/cceVAPGI.o :(.bss + 0x10): 'ret 'の多重定義 /tmp/ccC6uR4k.o:(.bss+0x10):ここで最初に定義されました – Thundaboom

答えて

2

この定義:あなたは(?おそらくMAIN.CPP)

彼らは「ドンCPPファイルからファイル、およびpressumably他のいくつかの翻訳単位を含む場合

CURL * curl; 
CURLcode res; 
std::string ret; 

が定義されますヘッダーファイル内にあるもののように見えますが、そうであればヘッダファイル内でexternを宣言し、実際の定義をcppファイルに移動することができます。

+0

私はCURL * curlとCURLcode resを.cppファイルに入れてもエラーは発生しませんでした。ヘッダーファイルに入れてはいけないことは、正確には何にしていないのでしょうか?まだ変数を定義していません。 – Thundaboom

+0

@ user1042519:どういう意味ですか?これら3つは変数の定義です。また、複数の定義エラーを引き起こすため、通常はヘッダファイル内に変数定義を必要としません。 –

+0

それでは、私はクラスではなく、.hppファイル自体ではなく、そのようなことをすることができるのはなぜですか?たぶん私はクラスとまったく同じように動作すると思っています。 – Thundaboom