2010-10-21 77 views
10

Tôi từng làm việc với toán.h mà không có bất kỳ vấn đề gì. Bây giờ, tôi sử dụng một thư viện bên ngoài mà chính nó có một tập tin gọi là math.h, nhưng bao gồm < cmath>.cmath.h và biên dịch lỗi

Thêm thư viện này để dự án của tôi (hoặc thậm chí chỉ cần thêm bao gồm thư mục, mà không cần chạm vào code) bây giờ tạo ra tấn lỗi từ < cmath>:

C: \ Program Files \ Microsoft Visual Studio 8 \ VC \ include \ cmath (18): lỗi C2039: 'acosf': không phải là thành viên của '' không gian tên chung ''

C: \ Program Files \ Microsoft Visual Studio 8 \ VC \ include \ cmath (18): lỗi C2873: 'acosf': không thể sử dụng ký hiệu trong khai báo sử dụng

C: \ Program Files \ Micr osoft Visual Studio 8 \ VC \ include \ cmath (18): lỗi C2039: 'asinf': không phải là thành viên của '`namespace toàn cầu' '

C: \ Program Files \ Microsoft Visual Studio 8 \ VC \ include \ cmath (18): lỗi C2873: 'asinf': biểu tượng không thể được sử dụng trong một sử dụng-khai

[vv, vv ...]

tôi không hiểu tại sao điều này xảy ra. Tôi đang sử dụng Visual Studio 2005 và tìm kiếm trên internet, có vẻ như vấn đề này được giải quyết theo VS 2008. Tuy nhiên, tôi muốn ở lại trên VS 2005 ...

Bao gồm using namespace std; ở khắp mọi nơi, hoặc thay đổi thứ tự của bao gồm của tôi dường như không thay đổi bất cứ điều gì. Xác định _STD_BEGIN giải quyết lỗi, nhưng tạo ra nhiều lỗi trong < xlocinfo>.

Cách này có thể được giải quyết?

+0

cmath là nghĩa vụ phải được sử dụng từ C++. Bạn có bao gồm tiêu đề này từ một tệp C? –

+0

thực sự một trong các tệp của tôi trong dự án của tôi là trong C và được bao gồm với "C" bên ngoài. Nó bao gồm "math.h" mà sau đó được tìm thấy trong thư mục bao gồm thư viện bên ngoài của tôi, và ngầm bao gồm cmath - do đó tôi không biết cách sửa lỗi đó. Tuy nhiên, các lỗi biên dịch này dường như xảy ra thậm chí sớm hơn trong mã của tôi, trước khi biên dịch mã C này. – WhitAngl

+0

thay đổi đoạn mã C cụ thể này thành C++ dường như không thay đổi tất cả các lỗi biên dịch từ cmath mặc dù ... – WhitAngl

Trả lời

4

Tôi không chắc chắn tôi đã đọc câu hỏi của bạn một cách chính xác nhưng có vẻ kỳ quặc rằng một thư viện sẽ gửi tệp math.h của chính nó.

Có lẽ bạn giả sử đặt thư mục mẹ trong đường dẫn bao gồm để <my_lib/math.h> có thể được bao gồm mà không xung đột với trình biên dịch <math.h>?

12

Vấn đề tương tự tồn tại trong VC 10. Tôi nghĩ rằng, <cmath> bao gồm chính nó là math.h nhưng được gán cho chính xác, được vận chuyển với VC nó sử dụng tài khoản được tạo trong Dự án người dùng (với nội dung khác nhau của khóa học).

Giải pháp: Không bao giờ sử dụng Tệp có tên math.h trong Dự án của bạn ... (Hoặc chỉnh sửa phần mềm ở đâu đó).

+1

Sau 2 giờ rách tóc, nhận xét của bạn làm cho tôi phát hiện ra tôi có một Math.h trong dự án của tôi, mà ngay cả với các xung đột viết hoa khác nhau với toán học của std.h. Đổi tên thành Math.h của tôi thành MathExtensions.h đã giải quyết được vấn đề. Cảm ơn bạn! – KomodoDave

+0

Bây giờ "Math" xuất hiện trong danh sách ngắn "nguồn tệp không bao giờ được đặt tên" này. (Tôi có một danh sách dài hơn "tệp nguồn không bao giờ có tên bao gồm chuỗi này" chứa "Lỗi", "Cảnh báo" và "Không thành công".) – davidbak

+0

Sự cố có trên VS 2015 và VS 2017 RC. Đổi tên Math.h thành ProjectnameMath.h sẽ giải quyết nó. –

0

Sự cố có thể là trộn các thư viện C với quy ước C++. Ví dụ:

#include <math.h> 
namespace TEST { 
} 

này biên dịch tốt, trong khi:

namespace TEST { 
    #include <math.h> 
} 

này tạo ra một số lượng lớn các lỗi giả mạo.

Chỉ cần để gây nhầm lẫn vấn đề:

#include <math.h> 
namespace TEST { 
    #include <math.h> 
} 

này cũng biên dịch vì nó chỉ có thể được bao gồm một lần (lần đầu tiên).

Do đó cũng:

#include <math.h> 
namespace TEST { 
    #include "SomethingThatIncludesMath.h" 
} 

Sẽ làm việc, trong khi:

namespace TEST { 
    #include "SomethingThatIncludesMath.h" 
} 

Sẽ không.

Bạn cũng có thể gặp sự cố tương tự bằng cách đưa tiêu đề C++ vào tệp * .c, thay vì tệp * .cpp.

Tôi chắc chắn rằng sự pha trộn tương tự khác của C và C++ có thể dẫn đến các vấn đề tương tự.

0

(1) Theo Microsoft, C2873 có nghĩa là;

'biểu tượng': không thể sử dụng ký hiệu trong khai báo sử dụng Chỉ thị sử dụng thiếu từ khóa không gian tên. Điều này làm cho trình biên dịch hiểu sai mã như một khai báo sử dụng chứ không phải là chỉ thị sử dụng.

(2) Ngoài ra khi tôi đã có C2873 với C2039 (tôi đã cố gắng hợp nhất CEF3 và Cinder), bằng cách nào đó tôi bỏ qua cả hai lỗi bằng cách thay đổi Properties-> Configuration Properties-> C/C++ -> Code Generation;

Enable Minimal Rebuild: Có (/ Gm), Enable C++ Ngoại lệ: Có (/ EHsc), Enable chức năng cấp Liên kết: trống