2017-05-27 16 views
7

tôi đã cố gắng để biên dịch the code với tùy chọn C++ 14:Có <algorithm> xác định X macro không?

#define X static_cast<double>(2) 
#include <algorithm> 
// if you change the two lines, no error occurs 

int main() 
{ 
    return 0; 
} 

Nhưng tôi nhận được lỗi sau X:

error: expected ',' or '...'

Tôi không nhận lỗi với tùy chọn C++ 98. Với phiên bản gcc 4.8.4 của tôi, tôi không nhận được lỗi, nhưng với 5.4.0 tôi làm. Đây có phải là một lỗi? Tôi có làm gì sai không?

+0

Không có lỗi với gcc6 – vsoftco

+0

[Không thể sao chép] (https://godbolt.org/g/Xv0ksm) với mã được cung cấp. Để biết liệu có định nghĩa macro hay không, bạn có thể kiểm tra tài liệu - không. – DeiDei

+0

Đó là lý do tại sao tôi cung cấp liên kết. Nếu đó là lỗi, nhà cung cấp được liên kết có thể sử dụng các phiên bản bị ảnh hưởng. Vì vậy, @DeiDei, nó là một lỗi và tôi đã làm mọi thứ tốt? Nếu có, vui lòng trả lời để chấp nhận. – DanielTuzes

Trả lời

8

Tôi gặp lỗi tương tự khi cài đặt g ++ 5.4.0 cục bộ của mình. Tôi nhìn g++ -E đầu ra, và có vẻ như các dấu vết lỗi để /usr/lib/gcc/x86_64-linux-gnu/5/include/ia32intrin.h dòng 252 và 254:

/* Write flags register */ 
extern __inline void 
__attribute__((__gnu_inline__, __always_inline__, __artificial__)) 
__writeeflags (unsigned long long X) // 252 
{ 
    __builtin_ia32_writeeflags_u64 (X); // 254 
} 

này có thể được coi một lỗi trong thư viện trình biên dịch đóng gói, vì không dành riêng #define s không được phép xung đột với chúng. (Các chức năng khác trong cùng một tiêu đề sử dụng tham số __X.)

+2

Đây là lý do tại sao bộ tiền xử lý là điều ác. – DeiDei

+0

Đó là một lỗi. Thư viện chuẩn không được sử dụng bất kỳ số nhận dạng nào trừ các số nhận dạng được đặt trước chính xác do vấn đề này. Stephan T. Lavavej đã từng đưa ra một độc thoại đam mê về độ dài họ phải thực hiện STL để đảm bảo nó hoạt động trong mọi trường hợp góc (họ cho rằng người dùng là ác và sẽ làm mọi điều kỳ lạ được phép trong tiêu chuẩn; họ không sai) . Macro do người dùng xác định rất dễ giải quyết (chỉ không sử dụng các tên như X); các kiểu do người dùng định nghĩa với các toán tử quá tải gây ra nhiều đau hơn. –

+0

Điều này đặt ra một câu hỏi thú vị. Có cách nào để bảo vệ các tiêu đề _own_ của tôi khỏi các vấn đề macro do người dùng xác định không? –

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