C 我可以创建一个名为“stdio.h”的自定义头文件吗?
我可以创建一个名为stdio.h的自定义头文件,并在我的程序中与之一起使用吗?我已经创建了一个名为stdio.h和main.c的文件,然后将此内容添加到main.c中,以测试它是否正常工作C 我可以创建一个名为“stdio.h”的自定义头文件吗?,c,header-files,C,Header Files,我可以创建一个名为stdio.h的自定义头文件,并在我的程序中与之一起使用吗?我已经创建了一个名为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
#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;
}
下面是我编译代码的方法:
duman@duman-pc ~/Desktop/Nuclear Test Zone $ gcc main.c -o test
duman@duman-pc ~/Desktop/Nuclear Test Zone $ ./test
没什么特别的,我也不知道什么会导致未定义的行为,因为我的编译器不允许使用同名函数
编辑3:只是为了看看是否有任何与名称使用相关的东西会抛出警告,我用所有这些标志编译了相同的代码:但是没有关于名称的内容
这是我能做的最好的了。希望它能对您有所帮助。我创建了一个名为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;
}
下面是我编译代码的方法:
duman@duman-pc ~/Desktop/Nuclear Test Zone $ gcc main.c -o test
duman@duman-pc ~/Desktop/Nuclear Test Zone $ ./test
没什么特别的,我也不知道什么会导致未定义的行为,因为我的编译器不允许使用同名函数
编辑3:只是为了看看是否有任何与名称使用相关的东西会抛出警告,我用所有这些标志编译了相同的代码:但是没有关于名称的内容
这是我能做的最好的了。希望它能帮助你。:
如果在搜索包含的源文件的任何标准位置放置与上述#include "stdio.h"
但是,如果您真的打算将该文件包含在
#include <stdio.h>
然后,为了让编译器找到它,您需要将它放在任何标准位置,所有的赌注都没有了
但是,在一个独立的执行环境中(即非托管的执行环境)。h可能不是一个标准的头文件名,所以它在那里也可能是完美的。并不是说独立执行环境有任何可移植性
因此,除非您更具体地说明您在做什么,否则我们只能参考C标准并耸耸肩。有一个名为stdio.h的源文件并不严格符合标准,但它很可能符合标准,所以YMMV。:
如果在搜索包含的源文件的任何标准位置放置与上述#include "stdio.h"
但是,如果您真的打算将该文件包含在
#include <stdio.h>
然后,为了让编译器找到它,您需要将它放在任何标准位置,所有的赌注都没有了
但是,在一个独立的执行环境中(即非托管的执行环境)。h可能不是一个标准的头文件名,所以它在那里也可能是完美的。并不是说独立执行环境有任何可移植性
因此,除非您更具体地说明您在做什么,否则我们只能参考C标准并耸耸肩。有一个名为stdio.h的源文件并不严格符合规范,但它可能非常符合规范,因此,如果您指定自定义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>
绝对不是您想要的。如果您指定自定义stdio.h来自文件目录中的什么位置,即doing
#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>
绝对不是您想要的。正如Antti Haapala所指出的,将文件命名为stdio.h并将其放在编译器查找包含文件的任何目录中被明确描述为未定义的行为
然而,默认情况下,编译器不会在源文件的目录中搜索标准头,但是-I.的命令行参数可以很容易地改变这种行为
如果没有此选项,并且假设您没有将源文件放在编译器的系统目录中,
您可以将名称stdio.h用于include文件,并将其包含在include stdio.h中,而不干扰include中引用的标准头,该头甚至可能根本不是文件
通过将源文件本身命名为stdio.h,您可以进一步陷入混乱
如果您真的想让读者感到困惑,请将源文件命名为a.out并使用gcc-o stdio.h-x c a.out进行编译。正如Antti Haapala所指出的那样,将文件命名为stdio.h并将其放在编译器查找包含文件的任何目录中被明确描述为未定义的行为
然而,默认情况下,编译器不会在源文件的目录中搜索标准头,但是-I.的命令行参数可以很容易地改变这种行为
如果没有此选项,并且假设您没有将源文件放在编译器的系统目录中,则可以使用名称stdio.h作为包含文件,并使用include stdio.h包含该文件,而不会干扰include中引用的标准头,该头甚至可能根本不是文件
通过将源文件本身命名为stdio.h,您可以进一步陷入混乱
如果您确实想让读者感到困惑,请将源文件命名为a.out并使用gcc-o stdio.h-x c a.out进行编译。为什么要这样做?你在生活中寻找一些额外的问题吗?只是问问它是否受到限制,或者我们可以这样做。。你可能会犯错。。试试看?@EugeneSh:这样做的一个可能原因是声明一些函数,这些函数在当前平台的常规头中不存在,但在其他平台vasprintf、getline或…,然后您将提供缺少的实现。这样的机制充其量是棘手的,最坏的情况是容易出错。使用include project/stdio.h可能会做得更好,它提供了额外的功能。或者包括aux_stdio.h或其他名称。@MartinJames:just try it的问题在于它可能在一种机器上工作,而在其他任何机器上都不工作。问题并没有说明这是否会成为一个问题;这并不能解释为什么OP想要玩火,想知道他们的手指是否会被灼伤。你为什么想要?你在生活中寻找一些额外的问题吗?只是问问它是否受到限制,或者我们可以这样做。。你可能会犯错。。试试看?@EugeneSh:这样做的一个可能原因是声明一些函数,这些函数在当前平台的常规头中不存在,但在其他平台vasprintf、getline或…,然后您将提供缺少的实现。这样的机制充其量是棘手的,最坏的情况是容易出错。使用include project/stdio.h可能会做得更好,它提供了额外的功能。或者包括aux_stdio.h或其他名称。@MartinJames:just try it的问题在于它可能在一种机器上工作,而在其他任何机器上都不工作。问题并没有说明这是否会成为一个问题;这并不能解释为什么OP想要玩火,想知道他们的手指是否会被灼伤。或者,换句话说,如果你足够愚蠢,你可以这么做,但风险由你自己承担,而且不便于携带或可靠。或者,换句话说,如果你够愚蠢,你可以这么做,但这是你自己的风险,不是便携的或可靠的。不是我的DV,但是…你在stdio.h里放了什么?您如何知道您的文件已被读取?您如何知道标准文件已被读取?您的程序没有证明从任何一个头读取了任何关键信息。这使得你的概念证明即使不是毫无意义的,也是非常薄弱的;标头应该声明而不是定义函数。您还应该使用选项进行编译,这样您就可以得到警告,最好是缺少声明的错误。但是,您现在已经完成了显示它在您尚未识别的平台上工作所需的最低限度的工作,并且使用了您尚未公开的编译器选项。你所展示的并没有违反标准,即行为未定义。“未定义行为”的一个版本似乎是合理的,即使它不能保证这样做。@JonathanLeffler好吧,我是个新手。我会慢慢地但肯定地学。谢谢你指导我。我也在发布我用来做这件事的东西。这里是第二次编辑。感谢添加信息。您可以尝试将-I.选项添加到编译中,并查看是否出现问题。可以说在LinuxMint18.2上使用GCC5.4.0进行编译就足够了。例如,我经常将我的测试环境标识为运行macOS Sierra 10.12.6和GCC 7.2.0的Mac——操作系统版本和GCC版本都会定期更改,GCC 7.2.0在本周早些时候发布。不是我的DV,而是……你在stdio.h中放了什么?您如何知道您的文件已被读取?您如何知道标准文件已被读取?您的程序没有显示任何关键信息被重新发布
广告从任何标题。这使得你的概念证明即使不是毫无意义的,也是非常薄弱的;标头应该声明而不是定义函数。您还应该使用选项进行编译,这样您就可以得到警告,最好是缺少声明的错误。但是,您现在已经完成了显示它在您尚未识别的平台上工作所需的最低限度的工作,并且使用了您尚未公开的编译器选项。你所展示的并没有违反标准,即行为未定义。“未定义行为”的一个版本似乎是合理的,即使它不能保证这样做。@JonathanLeffler好吧,我是个新手。我会慢慢地但肯定地学。谢谢你指导我。我也在发布我用来做这件事的东西。这里是第二次编辑。感谢添加信息。您可以尝试将-I.选项添加到编译中,并查看是否出现问题。可以说在LinuxMint18.2上使用GCC5.4.0进行编译就足够了。例如,我经常将我的测试环境识别为运行macOS Sierra 10.12.6和GCC 7.2.0的Mac——操作系统版本和GCC版本都会定期更改,GCC 7.2.0在本周早些时候发布。在include语句中使用反斜杠也有未定义的行为;这不是未定义的行为。它在dos/windows下一直运行良好,在linux un*x下从未运行过。@MichaëlRoy是的:字符“,\,//或/*出现在<和>分隔符之间的序列中,或者字符“,\,//或/*出现在分隔符之间的序列中,在头名称预处理中token@AnttiHaapala真正地我不知道。这对我来说很有效,但那可能是真的。另外,我输入错误,我使用了前斜杠。@Michalroy反斜杠在GCC中不起作用,因此可能是MingW抱怨了。在include语句中使用反斜杠也有未定义的行为;这不是未定义的行为。它在dos/windows下一直运行良好,在linux un*x下从未运行过。@MichaëlRoy是的:字符“,\,//或/*出现在<和>分隔符之间的序列中,或者字符“,\,//或/*出现在分隔符之间的序列中,在头名称预处理中token@AnttiHaapala真正地我不知道。这对我来说很有效,但那可能是真的。我也输入错了,我使用了正斜杠。@Michalroy反斜杠在GCC中不起作用,所以可能是MingW抱怨的例子。