C中__FILE__宏会意外地与前面的字符串连接起来

3
这是我问题的最简单示例:
#include<stdio.h>
int main() {
        printf("%s:%s\n", "I am in file" __FILE__);
}

当我忘记在 "__FILE__" 宏之前插入逗号时,我期望会得到一个编译错误,但实际上只得到了一个警告。因此输出将是:

我在 filetest.c 文件中:[C

  • 第一个字符串将是:"我在文件" 加上 __FILE__
  • 第二个字符串未定义

有人能告诉我为什么这不是编译错误吗?


4
你说你只是收到了一个警告。是什么样的警告?gcc会提示:warning: format ‘%s’ expects a matching ‘char *’ argument,这个警告对我来说相当明显。 - Hans Lub
@Someprogrammerdude 是因为它是一个重复的吗? - Antti Haapala -- Слава Україні
@AnttiHaapala 是关于什么的?关于字符串连接的问题吗?但是这个问题并不是关于那个的,因此这样的问题不是重复的。如果你找到一个关于为什么省略变长参数函数的参数不会报错的问题,那我很乐意投票关闭这个问题,但否则不会。 - Some programmer dude
@某程序员,这是“为什么printf函数的参数数量不正确时没有报错”的重复问题。 - Antti Haapala -- Слава Україні
@AnttiHaapala 我在SO上找不到那个问题。你能提供一个链接吗? - Some programmer dude
显示剩余9条评论
1个回答

5

虽然编译器在例如printfscanf这些函数中可以实现(因为它了解这些函数的格式字符串),但对于变参函数来说,它不能普遍实现。

如果创建一个变参函数,编译器如何知道正确的参数数量?答案是无法知道。因此,C规范并没有要求必须出错。

一些编译器(并非全部)会给出printfscanf的警告,这仅是编译器开发者足够友好添加的功能,并非必需的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接