在学习新功能时,我希望在调用时添加全名(例如,std::cin
而不是cin
)。是否有类似的方法来包含函数来自的头?例如,有没有办法指定排序函数来自<algorithm>
标题,而不是<iomanip>
标题,或其他什么?
例如,如果我可以使用sort
而不是std::algorithm::sort
来调用std::sort
,那就太酷了。标准库中内置了很多标题,只使用std::*
实际上并不具备信息性,并且很少具体说明*
的来源。
显然,随着我对C ++的改进,这可能没有必要,但我的目标是了解哪些函数与哪些标题一起更好地学习标准库。
如果没有这样的方法来指定函数,是否有一个函数可以用来确定哪个头提供了函数?
最终,我认为列出与每个标题相关联的功能将是一个很好的编码实践:
#include <iostream> //std::cout, std::cin
这样人们就可以弄清楚来自哪里!考虑到c ++社区对名称的清晰度的令人钦佩的痴迷,为什么这样做不会更多呢?
注意:这个问题才有可能,因为C ++是一种非Pythonic语言。毕竟,“明确胜过隐性”。 :)
答案 0 :(得分:4)
,有没有办法指定排序函数来自
<algorithm>
标题,而不是<iomanip>
标题,或其他什么?
没有。 C ++作为一种编译语言(故意忽略预处理器)不知道你的头文件名,因此它们与头文件中定义的对象和类型的名称无关。
如果有帮助,there is no std::sort
in <iomanip>
。
这也是一件奇怪的事情。通过匹配参数类型来执行重载分辨率,这足以消除歧义。
例如,如果我可以使用
std::algorithm::sort
而不是std::sort
来调用排序,那就太酷了。标准库内置了很多标题,只使用std::*
实际上并不具备信息性,并且很少具体说明*
的来源。
没关系。你不需要知道它来自哪里。编译器不需要知道它来自何处。这与使用 std::sort
完全无关。
是是的,C ++标准库没有将其内容组织成许多子命名空间,而是大部分时间都坚持使用顶级::std
。可以说,这使得使用标准库进行编码更加神秘,但事实上并非如此:它只会使查找规则复杂化,并且在处理运算符重载,模板实例化和处理时,会使您的生活变得更加困难。 friend
秒。
最终,我认为列出与每个标题相关联的功能将是一个很好的编码实践:
#include <iostream> //std::cout, std::cin
这样人们就可以弄清楚来自哪里!考虑到c ++社区对名称的清晰度的令人钦佩的痴迷,为什么这样做不会更多呢?
虽然我为一些POSIX / Linux套接字标题执行此操作,以便我知道将来可能删除哪些标题,但我不会对标准标题执行此操作。 C ++社区知道std::cout
在哪里被声明,如果他们忘记了,那么他们可以简单地查找它。
答案 1 :(得分:3)
我从未听说有人想要这样的东西。
你可以做的一件事(这很乏味,所以在我看来这是不值得的)是创建自己的命名空间,并在该命名空间中为你想要的每个名称使用using declarations
。
#include <iostream>
namespace iostream {
using std::cout;
using std::endl;
}
int main() {
iostream::cout << 24 << iostream::endl;
return 0;
}
我的建议是不要这样做。只需按名称使用它们,并在每次不确定它们来自何处时搜索网络。随着时间的推移,你将毫不费力地学习它们。
答案 2 :(得分:1)
指定或确定函数来自哪个包含头文件的方法?
您通常在遇到问题时执行此操作,例如尝试找出丢失符号的原因或发生标题冲突的原因。它不是你通常在运行时做的事情,因为Orbit中的Lightness Races和Bolov指出。
但是如果你想这样做,请执行以下操作:
gcc -E t.c
如果t.c
是:
$ cat t.c
#include <stdio.h>
int main(int argc, char* argv[])
{
return 0;
}
输出类似于:
$ gcc -E t.c
# 1 "t.c"
# 1 "<command-line>"
# 1 "t.c"
# 1 "/usr/include/stdio.h" 1 3 4
# 28 "/usr/include/stdio.h" 3 4
# 1 "/usr/include/features.h" 1 3 4
# 323 "/usr/include/features.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/predefs.h" 1 3 4
# 324 "/usr/include/features.h" 2 3 4
# 356 "/usr/include/features.h" 3 4
...
# 866 "/usr/include/stdio.h" 3 4
extern FILE *popen (__const char *__command, __const char *__modes) ;
extern int pclose (FILE *__stream);
extern char *ctermid (char *__s) __attribute__ ((__nothrow__));
# 906 "/usr/include/stdio.h" 3 4
extern void flockfile (FILE *__stream) __attribute__ ((__nothrow__));
extern int ftrylockfile (FILE *__stream) __attribute__ ((__nothrow__)) ;
extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__));
# 936 "/usr/include/stdio.h" 3 4
# 2 "t.c" 2
int main(int argc, char* argv[])
{
return 0;
}
然后,通过grep
管道输出以找到感兴趣的函数。