2010-09-21 27 views
7

Tôi có một không gian tên với hàm nội tuyến sẽ được sử dụng nếu một số tệp nguồn. Khi cố gắng liên kết ứng dụng của tôi, hàm nội tuyến được báo cáo dưới dạng các biểu tượng trùng lặp. Có vẻ như mã của tôi đơn giản không phải là nội tuyến các hàm và tôi đã tự hỏi liệu đây có phải là hành vi được mong đợi hay không và cách xử lý tốt nhất.chức năng nội tuyến trong không gian tên tạo ra các biểu tượng trùng lặp trong liên kết trên gcc

tôi sử dụng các tùy chọn gcc sau: -g -Wextra -pedantic -Wmissing-field-initializers -Wredundant-decls -Wfloat-bằng--Wno sắp xếp lại -Wno dài dài Phong cách cùng mã dường như biên dịch và liên kết đúng khi xây dựng trong môi trường VC7.

sau Các mã ví dụ cho thấy cấu trúc của mã:

/* header.h */ 
namespace myNamespace { 
inline bool myFunction() {return true;} 
} 

/* use_1.cpp */ 
#include "header.h" 
... 
bool OK = myNamespace::myFunction(); 
... 

/* use_2.cpp */ 
#include "header.h" 
... 
bool OK = myNamespace::myFunction(); 
... 
+1

OK là biến toàn cục trong mỗi tệp cpp? Điều đó sẽ gây ra lỗi biểu tượng trùng lặp. Giả sử rằng nó không phải là toàn cầu, ví dụ của bạn là hợp pháp C++. Thử biên dịch với -Winline. Bạn đang sử dụng phiên bản gcc nào? –

+1

Vui lòng đăng thông điệp trình biên dịch thực tế. Có lỗi xảy ra với các tệp nguồn tối thiểu (chỉ các dòng được đề cập mà không có nội dung được ngụ ý bởi ...) không? –

+1

Khi tôi thay đổi một trong các tên của 'OK' thành' OK1', thêm một hàm 'main' trống và loại bỏ' ... '; biên dịch cả hai tập tin với các tùy chọn mà bạn cung cấp làm việc một cách chính xác cho tôi. Bạn cần đăng thêm chi tiết vì nguyên nhân lỗi của bạn không có ở đây. –

Trả lời

-1

Các từ khóa inline được lấy chỉ như là một gợi ý bởi trình biên dịch. Nếu trình biên dịch quyết định rằng hàm sẽ hoạt động tốt hơn mà không có nội dòng, nó sẽ không inline nó. Có các từ khóa của nhà cung cấp cụ thể làm cho trình biên dịch nội tuyến một hàm - đó là __attribute__((always_inline)) cho GCC và __forceinline cho Visual C++. Nếu bạn thực sự muốn đảm bảo chức năng của bạn sẽ không gây ra lỗi liên kết trong tất cả các trường hợp trên tất cả các trình biên dịch chuẩn, bạn có thể muốn làm cho nó được tạo khuôn mẫu, vì các chức năng được bảo đảm không gây ra lỗi liên kết ngay cả khi được xác định trong tiêu đề . Đây là, tuy nhiên, khá không cần thiết cho các chức năng thực sự đơn giản.

+2

Mã của bạn không gây ra lỗi liên kết nếu bạn viết mã đúng cách. Viết các mẫu nơi chúng không cần thiết là vô nghĩa. –

+1

Cho dù trình biên dịch C++ có inline một hàm hay không thì không quan trọng ở đây. Trình biên dịch xử lý minh bạch này theo nguyên tắc as-if. Tuy nhiên, 'inline' ảnh hưởng đến ngữ nghĩa của chương trình. Nó là thích hợp ở đây bất kể trình biên dịch thực sự inlines chức năng. Vui lòng nghiên cứu "một quy tắc định nghĩa". – sellibitze

+0

SOLVED: Cuối cùng tôi đã có thời gian để theo dõi vấn đề về nguồn gốc của nó và (như thường lệ) đó là một vấn đề nhất quán đơn giản với việc sử dụng các tiêu đề được biên dịch trước. Tôi đã học được rằng việc sử dụng nội tuyến là trong thực tế minh bạch và không cần phải chăm sóc nếu trình biên dịch thực sự không inline chức năng hay không. Và quan trọng nhất: luôn sử dụng cờ -Winvalid-pch khi sử dụng các tiêu đề được biên dịch trước. – doberkofler

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