1. 解释 std::cout << std::endl
Q:执行std::cout << std::endl
时,发生了什么。 std::endl
是变量吗?
A:std::endl 是函数, std::cout << std::endl 看似是 std::cout 调用 std::endl, 但是 operator<<()
函数内部是调用了 std::endl(std::cout)
.
std::endl()
函数内部,首先打印换行符,然后flush,最后返回 std::ostream 对象。
2. 解释定义函数时包含头文件
Q:当定义一个函数,比如在 foo.cpp 中 int foo() { return 42; }
时,通常还包含了头文件 foo.h
; 而 foo.h
中是 extern "C" int foo();
方式声明的。为什么要写 #include "foo.h"
?不写会发生什么?
A: foo.h 中声明了 foo()
函数为 C 修饰的符号, 而在 foo.cpp 中,如果没包含 foo.h, 会导致 foo.cpp 中定义 C++ 修饰的符号。也就是说,是否包含 foo.h
, 会导致 foo.cpp -> foo.cpp.o 的转换后得到不同的符号。
而 foo.h
提供了函数的声明,当编译器看到 foo()
定义时会执行「name lookup」,看到了 extern "C" int foo()
那就是匹配上了, 没看到的话编译器会自行处理为 c++ 修饰的符号。
3. 解释 abs(0.2)
, ::abs(0.2)
, std::abs(0.2)
::abs(0.2)
是调用了全局作用域的 abs 函数, 是 C 标准库提供的函数。是执行了 qualified name lookup.
std::abs(0.2)
是从 std 命名空间去查询,是执行了 qualified name lookup。
abs(0.2)
则需要根据情况判断,可能被查询为 ::abs(0.2)
, 也可能被查询为 std::abs(0.2)
(比如先执行了 using namespace std
).
4. sizeof(long)
和 sizeof(int)
相等吗? 请在编译期实现计算
不限定编译器。不限定 c++ 标准。
直接背答案不给分。
https://godbolt.org/z/Kc1xnncsK
#include <type_traits> template <std::size_t N>
struct PrintSize; int main() { PrintSize<sizeof(long)> p1;PrintSize<sizeof(int)> p2;return 0;
}