cuốn sách gpt4 ai đã làm

c++ - Hành vi không mong muốn của hàm thư viện chuẩn abs() trên các trình biên dịch C++ khác nhau

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-03 10:39:13 27 4
mua khóa gpt4 Nike

Hãy xem xét chương trình sau:

#include 
#include

int main()
{
int d = (int)(abs(0,6) + 0,5);
printf("%d", d);
return 0;
}

g++ 7.2.0 Đầu ra 0 (xem demo trực tiếp đây)

g++ 6.3.0 (Xem demo trực tiếp đây)

prog.cc: Trong hàm 'int main()':
prog.cc:6:26: error: 'abs' không được khai báo trong phạm vi này
int d = (int)(abs(0,6) + 0,5);
^
prog.cc:6:26: lưu ý: giải pháp thay thế được đề xuất:
Trong tệp được bao gồm từ prog.cc:2:0:
/opt/wandbox/gcc-6.3.0/include/c++/6.3.0/cmath:103:5: lưu ý: 'std::abs'
cơ bụng(_Tp __x)
^~~

kêu vang++ 5.0.0 Đầu ra 1 (Xem demo trực tiếp đây)

kêu vang++ 3.6.0 (Xem demo trực tiếp đây)

prog.cc:6:19: error: sử dụng mã định danh không được khai báo 'abs'; ý bạn là 'fabs'?
int d = (int)(abs(0,6) + 0,5);
^~~
tuyệt vời
/usr/include/x86_64-linux-gnu/bits/mathcalls.h:181:14: lưu ý: 'fabs' được khai báo ở đây
__MATHCALLX (fabs,, (_Mdouble_ __x), (__const__));
^
/usr/include/math.h:71:26: lưu ý: được mở rộng từ macro '__MATHCALLX'
__MATHDECLX (_Mdouble_, hàm, hậu tố, args, attrib)
^
/usr/include/math.h:73:22: lưu ý: được mở rộng từ macro '__MATHDECLX'
__MATHDECL_1(loại, hàm, hậu tố, đối số) __attribute__ (attrib \);
^
/usr/include/math.h:76:31: lưu ý: được mở rộng từ macro '__MATHDECL_1'
kiểu bên ngoài __MATH_PRECNAME(hàm, hậu tố) đối số __THROW
^
/usr/include/math.h:79:42: lưu ý: được mở rộng từ macro '__MATH_PRECNAME'
#define __MATH_PRECNAME(tên,r) __CONCAT(tên,r)
^
/usr/include/x86_64-linux-gnu/sys/cdefs.h:88:23: lưu ý: được mở rộng từ macro '__CONCAT'
#define __CONCAT(x,y) x ## y
^
1 lỗi được tạo ra.

Microsoft VC++ 19.00.23506 Đầu ra 1 (Xem bản demo trực tiếp đây)

Chính xác thì điều gì đang xảy ra với chương trình này? Tại sao nó cho kết quả đầu ra khác nhau khi được biên dịch trên các trình biên dịch C++ khác nhau? Tại sao các chương trình hoạt động khác nhau ngay cả trên các phiên bản khác nhau của cùng một trình biên dịch? Đây có phải là sự cố trình biên dịch hay thư viện chuẩn (libstdc++ & libc++) 问题? C++ 标准对此有何规定?

Tái bút:我知道我需要编写 std::abs thay vì abs。但这不是我的问题。

câu trả lời hay nhất

所有从 C 标准库引入功能的 cname 库头都必须在命名空间 tiêu chuẩn 中引入这些符号。它们也Có thể,但绝对不是必须将它们引入全局命名空间。 [headers]/4 :

Except as noted in Clauses [library] through [thread] and Annex [depr], the contents of each header cname is the same as that of the corresponding header name.h as specified in the C standard library. In the C++ standard library, however, the declarations (except for names which are defined as macros in C) are within namespace scope of the namespace std. It is unspecified whether these names (including any overloads added in Clauses [language.support] through [thread] and Annex [depr]) are first declared within the global namespace scope and are then injected into namespace std by explicit using-declarations.

所以不同的编译器,甚至不同的编译器版本,意味着不同的实现细节。

关于c++ - 标准库函数 abs() 在不同 C++ 编译器上的异常行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48089039/

27 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress