替换#包括在C中使用头文件

替换#包括在C中使用头文件,c,C,有时写一些有趣的代码是很合适的,有时写一些不可读的代码或一些带有goto语句的代码是很有趣的;) 我想知道是否可以使用头文件将#include“stdio.h”替换为您选择的一些单词 如果我尝试这样做,我会得到如下错误 error: stray ‘#’ in program| note: in expansion of macro ‘a’| 当我在头文件中尝试类似“#define a#include”这样的方法时。没有办法取代在c程序中包含头文件的方式,这是标准的一部分,除非您编写自己的编译器

有时写一些有趣的代码是很合适的,有时写一些不可读的代码或一些带有goto语句的代码是很有趣的;)

我想知道是否可以使用头文件将
#include“stdio.h”
替换为您选择的一些单词

如果我尝试这样做,我会得到如下错误

error: stray ‘#’ in program|
note: in expansion of macro ‘a’|

当我在头文件中尝试类似“
#define a#include
”这样的方法时。

没有办法取代在c程序中包含头文件的方式,这是标准的一部分,除非您编写自己的编译器,您可以使它按您的意愿工作。

没有办法取代在c程序中包含头文件的方式,是标准的一部分,除非您编写自己的编译器,否则您可以让它按照您的需要工作

我会犯这样的错误

错误:程序中出现错误“#”|

注意:在宏“a”的展开中|

当我在头文件中尝试类似于“#定义#包含”的内容时

在执行任何宏扩展之前,在翻译阶段4(C2011,6.10/2)开始时识别预处理指令。因此,尽管您可以通过扩展
#include
定义宏
a
,但扩展不是预处理指令,无论是在该点上(因为它不是行上的第一个标记),还是在扩展宏时(因为太晚了)

因此,使用这样的宏会导致文本
#include
出现在预处理器输出中,而在普通
#include
指令可能有效出现的任何点上,这都是无效的C

我会犯这样的错误

错误:程序中出现错误“#”|

注意:在宏“a”的展开中|

当我在头文件中尝试类似于“#定义#包含”的内容时

在执行任何宏扩展之前,在翻译阶段4(C2011,6.10/2)开始时识别预处理指令。因此,尽管您可以通过扩展
#include
定义宏
a
,但扩展不是预处理指令,无论是在该点上(因为它不是行上的第一个标记),还是在扩展宏时(因为太晚了)

因此,使用这样的宏会导致文本
#include
出现在预处理器输出中,而在普通
#include
指令可能有效出现的任何点上,这都是无效的C。

您的意思是

//yams.c

int main()
{
#define STDIO_H <---without this define i still get yams!
    printf("yams\n");
    return 0;
}

# make yams
cc     yams.c   -o yams
yams.c: In function ‘main’:
yams.c:6:5: warning: incompatible implicit declaration of built-in function ‘printf’
     printf("yams\n");
     ^
# ./yams
yams
# 
你是说这个吗

//yams.c

int main()
{
#define STDIO_H <---without this define i still get yams!
    printf("yams\n");
    return 0;
}

# make yams
cc     yams.c   -o yams
yams.c: In function ‘main’:
yams.c:6:5: warning: incompatible implicit declaration of built-in function ‘printf’
     printf("yams\n");
     ^
# ./yams
yams
# 

大问题。为什么?有趣的是,找到可能的边界总是很有用的。嗯,
goto
语句在标准C函数的源文件中几乎是标准的做法,但是,同样,它们仍然很有趣,并且对于从嵌套代码块中跳出的短跳转很有用。大问题。为什么?有趣的是,找到可能的边界总是很有用的。嗯,
goto
语句几乎是标准的做法,如果您查看标准C函数的源文件,那么它们仍然很有趣,并且对于从嵌套的代码块中跳出很短时间很有用。还有什么比
#包括“stdio.h”更好/更清晰
。。。没有什么?看起来很清楚。@Ben,我不认为OP是在寻找更好的;我认为他在寻找变态。还有什么比
#更好/更清楚的,包括“stdio.h”
。。。没有什么?看起来很清楚。@Ben,我不认为OP是在寻找更好的;我认为他在寻找变态。我认为你误解了标题
和标准库之间的区别是自动链接的。它提供函数定义,即使函数没有正确声明。代码是否有效取决于编译器;通常情况下,这种情况发生在你身上。然而,我相信所有这些都与问题无关。@JonathanLeffler,好的,整洁,那么stdio.h是什么,类似于标准库之外的特定设置定义?标题
定义了必要的类型和宏,并声明了标准所需的函数(加上实现选择提供的任何扩展)。这就是它的工作-将信息提供给编译器。然后链接器获取从源代码和库的预编译实现创建的目标文件,并创建一个可运行的可执行文件。我认为您误解了头
和标准库之间的区别是autOmaly链接。这提供了函数定义,即使函数没有正确声明。代码是否工作取决于编译器;通常情况下,它会发生。然而,我相信,所有这些都与问题无关。@JonathanLeffler,好的,整洁,那么stdio.h是什么,类似于特定设置定义的东西标准库的e?标题
定义了必要的类型和宏,并声明了标准所需的函数(以及实现选择提供的任何扩展)。这是它的工作-使信息可供编译器使用。然后,链接器获取从源代码和库的预编译实现创建的目标文件,并创建一个可运行的可执行文件。