2012-01-23 33 views
11

Tôi đang viết một Makefile đơn giản mà trông như thế nàynhiều định nghĩa về biến namespace, C++ biên soạn

CC=gcc 
CXX=g++ 
DEBUG=-g 
COMPILER=${CXX} 
a.out: main.cpp Mail.o trie.o Spambin.o 
     ${COMPILER} ${DEBUG} main.cpp Mail.o trie.o Re2/obj/so/libre2.so 

trie.o: trie.cpp 
     ${COMPILER} ${DEBUG} -c trie.cpp 

Mail.o: Mail.cpp 
     ${COMPILER} ${DEBUG} -c Mail.cpp 

Spambin.o: Spambin.cpp 
     ${COMPILER} ${DEBUG} -c Spambin.cpp 

clean: 
     rm -f *.o 

Tôi có một config.h tên tập tin được yêu cầu trong Mail.cppSpambin.cpp, vì vậy tôi có #include "config.h" trong cả hai số Mail.cppSpambin.cpp. config.h trông như thế này:

#ifndef __DEFINE_H__ 
#define __DEFINE_H__ 

#include<iostream> 

namespace config{ 
     int On = 1; 
     int Off = 0; 

     double S = 1.0; 
} 
#endif 

But when I try to compile the code it gives me 
Mail.o:(.data+0x8): multiple definition of `config::On' 
/tmp/ccgaS6Bh.o:(.data+0x8): first defined here 
Mail.o:(.data+0x10): multiple definition of `config::Off' 
/tmp/ccgaS6Bh.o:(.data+0x10): first defined here 

Bất kỳ một thể giúp tôi gỡ rối này?

+1

Tôi đã gỡ bỏ các '[c]' thẻ kể từ khi câu hỏi không có gì gì để làm với C. – NPE

+5

Bạn có thực sự có hai biến ** ** gọi và tắt ? Hoặc là những hằng số? Nếu họ là hằng số bạn nên làm cho họ như vậy và vấn đề sẽ biến mất. Vâng, bạn sẽ được trái với vấn đề của S –

+1

Bạn không nên sử dụng tên dành riêng cho bảo vệ bao gồm của bạn. –

Trả lời

33

Bạn không thể gán cho biến không gian tên trong tệp tiêu đề. Làm như vậy xác định các biến thay vì chỉ tuyên bố chúng. Đặt nó trong một tệp nguồn riêng biệt và thêm nó vào tệp Makefile và nó sẽ hoạt động.

Sửa Ngoài ra, bạn cần phải thực hiện các tờ khai trong file header extern.

Vì vậy, trong các tập tin tiêu đề namespace sẽ trông như thế này:

namespace config{ 
    extern int On; 
    extern int Off; 

    extern double S; 
} 

Và trong file nguồn:

namespace config{ 
    int On = 1; 
    int Off = 0; 

    double S = 1.0; 
} 
+1

Bạn có nghĩa là, "không thể _initialize_ biến không gian tên trong tập tin tiêu đề"? Ngay cả sự thay đổi này cũng không đủ. Một khai báo không có bộ khởi tạo là một định nghĩa trừ khi 'extern' được sử dụng một cách rõ ràng. –

+0

@CharlesBailey Ghi nhớ về 'extern' chỉ khi bạn viết bình luận của bạn. –

+0

@CharlesBailey không phải là biến 'extern' theo mặc định? –

2

Hãy xem Variable definition in header files

Bạn phải đặt của bạn định nghĩa biến, tức là gán giá trị trong tệp nguồn hoặc bảo vệ nó bằng trình bảo vệ #ifdef để không được định nghĩa hai lần khi được bao gồm trong các tệp nguồn riêng biệt.

0

Trong tệp tiêu đề của bạn, hãy khai báo const 3 biến của bạn. Ví dụ như thế này:

#ifndef __DEFINE_H__ 
#define __DEFINE_H__ 

#include<iostream> 

namespace config{ 
     const int On = 1; 
     const int Off = 0; 

     const double S = 1.0; 
} 
#endif 
+0

Tôi nghĩ rằng vấn đề với câu trả lời này là nếu bạn làm điều này, họ không còn _variables_ nữa. Tuy nhiên như là một thay thế cho '# define' hằng số, điều này dường như với tôi như một cách hợp lý để đi. – meowsqueak

Các vấn đề liên quan