Vì một lý do nào đó, tôi nhận được nhiều khai báo nội dung trong tệp tiêu đề của mình mặc dù tôi đang sử dụng bộ phận bảo vệ tiêu đề. mã ví dụ của tôi là dưới đây:Tiêu đề/Bao gồm nhân viên bảo vệ không hoạt động?
main.c:
#include "thing.h"
int main(){
printf("%d", increment());
return 0;
}
thing.c:
#include "thing.h"
int increment(){
return something++;
}
thing.h:
#ifndef THING_H_
#define THING_H_
#include <stdio.h>
int something = 0;
int increment();
#endif
Khi tôi cố gắng để biên dịch này, GCC nói rằng tôi có nhiều định nghĩa về biến số. ifndef nên chắc chắn rằng điều này không xảy ra, vì vậy tôi nhầm lẫn vì sao nó lại xảy ra.
Lỗi * trình biên dịch * "nhiều * khai báo *" không giống với * linker * error "multiple * definitions *". Bạn đã đề cập đến cả hai trong câu hỏi của bạn (trong khi thực tế vấn đề duy nhất là sau này); hiểu sự khác biệt là chìa khóa để hiểu những gì đang xảy ra. Các tiêu đề bảo vệ ngăn chặn nhiều * khai báo *, không nhiều * định nghĩa *. – Clifford
@Clifford xin lỗi, tôi cần phải đề cập đến tôi đã nhận được một lỗi liên kết. – user1007968
Ngoài ra, trong C 'int increment();' không phải là một mẫu thử nghiệm nhưng khai báo một hàm với số lượng tham số không xác định. Sử dụng 'int increment (void);' cho điều đó. –