我正在尝试定义预定义的函数,这给了我错误……下面的程序出了什么问题。有人告诉我,我可以定义预定义的函数。我知道这是不正确的,但是我仍然在发布...如果有人.....
#include <stdio.h>
#include <stdlib.h>
#define scanf "%s abc";
int main()
{
printf(scanf,scanf);
return 0;
}
答案 0 :(得分:6)
此
printf(scanf, scanf);
展开至此
printf("%s abc"; , "%s abc";);
显然,它不会与函数调用中的那些分号一起编译。在宏定义中删除分号,函数调用将变成
printf("%s abc" , "%s abc");
可能会编译并打印%s abc abc
。或者它可能会做一些完全不同的事情,因为它是不确定的行为,如this answer更详细地解释。
此外,宏的用法非常荒谬和误导,因此我强烈建议您不要这样做。不要使用宏来重新定义有效的标识符,例如scanf
,因为如果其他人试图读取该代码,则他们将无法理解它,因为他们知道的东西突然不再能以这种方式工作。
答案 1 :(得分:2)
这是C标准关于将标准库标识符定义为宏的说明:
C17 7.1.3 / 1重点:
- 每个标识符,其文件范围在以下任何子条款中列出(包括 将来的库说明)保留用作宏名和用作 同一名称空间中的文件作用域,如果包含任何与之相关的标头。
C17 7.1.3 / 2重点:
没有其他标识符保留。 如果程序在程序中声明或定义了标识符, 保留的上下文(7.1.4允许的除外),或者定义保留的上下文 标识符作为宏名,其行为是不确定的。
这意味着任何事情都可能发生,并且#include <stdio.h>
后跟#define scanf
被认为是错误。
答案 2 :(得分:1)
您应该删除#define行中的分号