c++ eof返回什么类型?

8aqjt8rx  于 2023-03-20  发布在  其他
关注(0)|答案(3)|浏览(182)

cppreference.comcplusplus.com都说它是int_type,但它们没有解释(至少我找不到,必应聊天也找不到)它是什么类型(我想它可以是任何有符号整数类型,至少和charbool一样宽)。

cqoc49vn

cqoc49vn1#

特殊值EOF需要是比相应字符类型宽的整数类型,因为它不能与任何字符具有相同的值。
在一般情况下,但不是所有情况下(!),它是-1。
特征类模板std::char_traits为各个字符类型提供对应的类型:https://en.cppreference.com/w/cpp/string/char_traits
例如,对于char,它是int,这与平台有关,但至少有16位宽。

lmyy7pcs

lmyy7pcs2#

当您在文档中遇到未定义的术语时,请尝试查找更高级别的文档。从std::char_traits<CharT>::eof(或std::char_traits::eof)的文档转到std::char_traits<CharT>(或std::char_traits)的文档。

  • cppreference.comint_type一个整数类型,可以保存char_type加上EOF的所有值“

(另一行指定char_typeCharT的别名,其中CharT是模板参数。)

  • cplusplus.comint_type可表示所有charT值以及eof()的整数类型“

(This接着指示当charTchar时,则int_typeint)。
请注意,此类型必须比字符类型宽(不仅仅是“至少一样宽”),因为文件结束值必须与所有字符值不同。

mrphzbgm

mrphzbgm3#

你可以打印出一个特定实现的EOF类型。注意,这些类型可能因实现或平台而异,所以要注意可移植性的限制。
Boost demangle只是为了易读性。

#include <iostream>
#include <string>
#include <typeinfo>
#include <boost/core/demangle.hpp>

int main() {
    std::cout << "char is " << boost::core::demangle(typeid(std::char_traits<char>::eof()).name()) << "\n";
    std::cout << "wchar_t is " << boost::core::demangle(typeid(std::char_traits<wchar_t>::eof()).name()) << "\n";
    std::cout << "char16_t is " << boost::core::demangle(typeid(std::char_traits<char16_t>::eof()).name()) << "\n";
    std::cout << "char32_t is " << boost::core::demangle(typeid(std::char_traits<char32_t>::eof()).name()) << "\n";
}

相关问题