如何指定或确定函数来自哪个包含头文件?

时间:2014-01-11 15:21:55

标签: c++

在学习新功能时,我希望在调用时添加全名(例如,std::cin而不是cin)。是否有类似的方法来包含函数来自的头?例如,有没有办法指定排序函数来自<algorithm>标题,而不是<iomanip>标题,或其他什么?

例如,如果我可以使用sort而不是std::algorithm::sort来调用std::sort,那就太酷了。标准库中内置了很多标题,只使用std::*实际上并不具备信息性,并且很少具体说明*的来源。

显然,随着我对C ++的改进,这可能没有必要,但我的目标是了解哪些函数与哪些标题一起更好地学习标准库。

如果没有这样的方法来指定函数,是否有一个函数可以用来确定哪个头提供了函数?

最终,我认为列出与每个标题相关联的功能将是一个很好的编码实践:

#include <iostream>  //std::cout, std::cin

这样人们就可以弄清楚来自哪里!考虑到c ++社区对名称的清晰度的令人钦佩的痴迷,为什么这样做不会更多呢?

注意:这个问题才有可能,因为C ++是一种非Pythonic语言。毕竟,“明确胜过隐性”。 :)

3 个答案:

答案 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管道输出以找到感兴趣的函数。