我可以创建一个名为" stdio.h"的自定义头文件吗?

时间:2017-08-17 17:26:09

标签: c header-files

我可以创建一个名为stdio.h的自定义头文件,并可以在我的程序中与<stdio.h>一起使用吗?

4 个答案:

答案 0 :(得分:4)

C11 7.1.2p3

  

如果文件的名称与上述其中一个相同&lt;和&gt;分隔符序列(未作为实现的一部分提供)放置在搜索包含源文件的任何标准位置,行为未定义

标准位置则指6.10.2p2

  

实现定义的位置序列中搜索由&lt;之间的指定序列唯一标识的标头。和&gt;分隔符,并导致该标题的整个内容替换该指令。 如何指定地点或标识的标头是实施定义的。

所以这里给出的唯一保证是如果你的stdio.h不在实现定义的地方搜索标题,那么行为就不会#39; t未定义。然后,您可以将其包含在

#include "stdio.h"

但是,如果你真的打算将文件包含在

#include <stdio.h>

然后让编译器找到它,你需要将它放在任何标准位置,所有的赌注都关闭。

然而,在独立 - 即非托管 - 执行环境中。 stdio.h可能不是标准的标题名称,所以它可能完全没问题。并不是关于独立执行环境的任何可移植性。

因此,除非你更具体地指明你所做的事情,否则我们只能参考C标准并耸耸肩。拥有一个名为stdio.h的源文件并不严格符合,但它很可能符合要求,所以YMMV。

答案 1 :(得分:0)

我创建了一个名为stdio.h和main.c的文件,然后将此内容添加到main.c以测试它是否正常工作。

#include "stdio.h"
#include <stdio.h>

int main()
{
    testArea(); // this will use "stdio.h"
    int test = 2;
    printf("%d", test); // this will use <stdio.h>
    return 0;
}

节目输出:

1002 (100 from "stdio.h" and 2 from <stdio.h>)

my stdio.h 的内容:

#include <stdio.h>

void testArea()
{
    int abc = 100;
    printf("%d", abc);
}

惊喜,确实如此!现在,您应该知道使用&#34;&#34;表示通过文件路径搜索头文件。同时&lt;&gt;基本上看一下编译器的includes文件夹。

所以,你可以这样做。

PS:如果您要进行投票,请做出解释,以便我也可以了解其中的错误。它对我来说很好。

编辑:现在,您可以看到该程序知道要拨打什么以及该做什么。

额外奖励:如果您尝试添加文件编译器中存在的同名函数,则会给您一个错误。

#include <stdio.h>

void testArea()
{
    int abc = 100;
    printf("%d", abc);
}

void printf()
{

}

将返回stdio.h:9:7: error: conflicting types for ‘printf’作为示例。您应该避免使用现有功能,但它不限于相同的名称头文件。你不能用任何文件名来做,因为名字会发生冲突。

再一次,使用这个很好。应该没有任何问题。

编辑2:我使用Linux Mint 18.2

这是我的gcc --version

gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

而且,这是我编译代码的方式:

duman@duman-pc ~/Desktop/Nuclear Test Zone $ gcc main.c -o test
duman@duman-pc ~/Desktop/Nuclear Test Zone $ ./test

没有什么花哨的,我也不知道是什么导致了未定义的行为,因为我的编译器不允许使用相同的名称函数。

编辑3:只是为了查看与名称使用相关的任何内容是否引发警告我使用所有这些标志编译了相同的代码:https://stackoverflow.com/a/34971392/7735711并且没有关于名称的信息。

这是我能做的最好的事情。希望它可以帮助你。

答案 2 :(得分:0)

如果指定文件目录中的自定义“stdio.h”来自何处(即执行

#include "C:/ProgrammingC/stdio.h"

可能很好,但是

#include "stdio.h" //This only selects the standard include
                   //if there's no other stdio.h in the build directory

有风险,

#include <stdio.h>

绝对不是你想要的。

答案 3 :(得分:0)

正如 Antti Haapala 所述,它被明确地描述为未定义的行为,用于命名文件stdio.h并将其放在编译器查找包含文件的任何目录中。

然而,默认情况下,编译器不会在源文件的目录中搜索标准头,但-I.的命令行参数可以轻松更改此行为。

如果没有此选项并假设您没有将源文件放在编译器的系统目录中,则可以使用名称stdio.h作为包含文件,并将其包含在#include "stdio.h"中而不会干扰使用#include <stdio.h>中提到的标准标题(可能根本不是文件)。

您可以通过命名源文件本身stdio.h来进一步进入混乱状态......

我真的想混淆读者,将源文件命名为a.out并使用gcc -o stdio.h -x c a.out进行编译。