C标准(C99+)是否要求实现允许将函数声明放在块中,以便将其范围限制在块and where is this covered in the standard内?假设该函数具有外部链接,并在链接时包含的单独源文件中定义.

我注意到,在编译以下程序时,GCC会生成一个错误:

int main(void)
{
  void myFunc(void);

  myFunc();

  return 0;
}

void test2(void)
{
  myFunc();
}

错误(这是预期的):

..\main.c: In function 'test2':
..\main.c:12:3: warning: implicit declaration of function 'myFunc' [-Wimplicit-function-declaration]
   12 |   myFunc();
      |   ^~~~~~
..\main.c:3:8: note: previous declaration of 'myFunc' was here
    3 |   void myFunc(void);
      |        ^~~~~~
..\main.c:12:3: error: incompatible implicit declaration of function 'myFunc'
   12 |   myFunc();
      |   ^~~~~~
..\main.c:3:8: note: previous implicit declaration of 'myFunc' was here
    3 |   void myFunc(void);
      |        ^~~~~~

这是意料之中的,因为myFunc()是在main()的范围内宣布的.

如果从test2()中删除了对myFunc()的调用,并且在链接时包含的另一个源文件中定义了test2(),则程序编译并链接时不会出现错误或警告.

基于这个结果,这个问题的答案是肯定的,但我想知道这个行为是否在规范中明确定义,是否可以被认为是可移植的.

推荐答案

在职能范围内

void test2(void)
{
  myFunc();
}

名字myFunc没有申报.

函数的声明仅在main中可见.

为了向后兼容,编译器认为函数的返回类型为int.

对于您的问题,您可以在块范围内声明一个函数,但除了extern之外,没有存储类说明符(C标准,6.7.1存储类说明符):

6具有块作用域的函数的标识符声明

也就是说,您不能在块范围内声明函数,例如

int main(void)
{
  static void myFunc(void);

  myFunc();

  return 0;
}

C++相关问答推荐

不同到达时间的轮询实现

为什么GCC可以调用未定义的函数?

无效指针值在函数调用之间莫名其妙地改变

仅在给定的大小和对齐方式下正确创建全局

如何将长字符串转换为较小的缩写,该缩写由第一个字符、最后一个字符和中间的字符数组成?

是什么让numpy.sum比优化的(自动矢量化的)C循环更快?

如何在C中打印包含扫描字符和整数的语句?

使用错误的命令执行程序

是否可以通过调用两个函数来初始化2D数组?示例:ARRAY[STARTING_ROWS()][STARTING_COLUMNS()]

如何计算打印二叉搜索树时每行所需的空间?

ifdef __cplusplus中的整数文字单引号

如何在GDB中查看MUSL的源代码

MacOS下C++的无阻塞键盘阅读

Caesar密码调试:输出文本末尾的问号和随机字符

用于计算位数和的递归C函数

我正在使用c学习数据 struct ,在学习堆栈时,我试图将中缀转换为后缀,并编写了这段代码.代码未给出输出

C 和 C++ 标准如何告诉您如何处理它们未涵盖的情况?

我正在使用 klib 库 我可以使用 (khash) KHASH_SET_INIT_INT64() 负值作为键.因为我在头文件中看到它使用 unsigned long int

Makefile - 将 .o 文件放入子文件夹中

Codewars Kata 掷骰子的不稳定行为