为什么这样工作?我不明白为什么我的代码可以在C中工作

xIvan95

我目前正在学习C,并且遇到了这种奇怪的行为(基于我的理解):

我有2个文件:

文件1.c

#include <stdio.h>

int main()
{
    printNumber(2);
    return 0;
}

文件2.c

void printNumber(int number)
{
    printf("Number %d is printed.", number);
}

输出:

Number 2 is printed.

为什么我没有收到声明错误?我认为您需要在文件(或更好的头文件)中的某个位置声明一个函数

我已经搜索了论坛,试图找到答案,但是我看到代码非常相似的人遇到了错误,但是不知何故我没有得到它。

顺便说一句,我正在使用GCC和C11。谢谢。

肾上腺素

通常,如果调用未在任何地方定义的函数,则会通过链接器而不是编译器看到错误编译器可能会警告您隐式声明,但通常会放手。

使用gcc 8.3编译file1.c的示例:

$ gcc -o test file1.c
file1.c: In function ‘main’:
file1.c:5:5: warning: implicit declaration of function ‘printNumber’ [-Wimplicit-function-declaration]
     printNumber(2);
     ^~~~~~~~~~~
/usr/bin/ld: /tmp/ccs0wv7L.o: in function `main':
file1.c:(.text+0xf): undefined reference to `printNumber'
collect2: error: ld returned 1 exit status

请注意,警告来自编译器,但只有ld(链接器)会给您提供错误信息,说明您未定义对函数的引用。

因此,我怀疑您像以下那样编译程序,该链接器足够聪明以关联目标代码:

$ gcc -o test file1.c file2.c
file1.c: In function ‘main’:
file1.c:5:5: warning: implicit declaration of function ‘printNumber’ [-Wimplicit-function-declaration]
     printNumber(2);
     ^~~~~~~~~~~
file2.c: In function ‘printNumber’:
file2.c:3:5: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
     printf("Number %d is printed.", number);
     ^~~~~~
file2.c:3:5: warning: incompatible implicit declaration of built-in function ‘printf’
file2.c:3:5: note: include ‘<stdio.h>’ or provide a declaration of ‘printf’
file2.c:1:1:
+#include <stdio.h>
 void printNumber(int number)
file2.c:3:5:
     printf("Number %d is printed.", number);
     ^~~~~~

您可以在上面看到警告,但实际上它可以编译,链接程序也不会抱怨。如果在IDE中运行此程序,则可能甚至看不到警告消息。因此,您有一种幻想,即使您认为代码应该有错误,代码也能正常工作

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我已经写了这段代码,但我不明白为什么它会像这样工作

来自分类Dev

我不明白为什么这段代码在我的代码中以这种方式工作

来自分类Dev

我不明白为什么Redirect()无法正常工作

来自分类Dev

我不明白为什么charindex无法正常工作

来自分类Dev

我不明白为什么我的冒泡排序代码无法正常工作

来自分类Dev

我不明白为什么我的冒泡排序代码无法正常工作

来自分类Dev

我不明白为什么我的波形是这样出来的

来自分类Dev

我不明白为什么此代码无法正常工作!有人可以告诉我我做错了吗?

来自分类Dev

我不明白为什么我的“如果”命令无法正常工作

来自分类Dev

此do-while循环无法正常工作,我不明白为什么

来自分类Dev

我不明白为什么这个@selector无法正常工作

来自分类Dev

我不明白为什么我的验证中间件会这样

来自分类Dev

为什么在Java中以下代码中Arrayindex越界?我已经检查了界限,但不明白为什么/

来自分类Dev

不明白为什么 .stream() 工作正常但 .parallelStream() 不

来自分类Dev

我不明白为什么我需要按特定顺序放置两行才能使其工作(递归)

来自分类Dev

我不明白为什么我尝试时我的代码无法采用CSS

来自分类Dev

我不明白为什么有些指针地址是这样的

来自分类Dev

不明白为什么我的代码给我一个IndexError

来自分类Dev

为什么我的代码连续打印两次?我不明白这个问题

来自分类Dev

我的代码中出现KeyError:'',但我不明白为什么

来自分类Dev

我不明白为什么我的 APCS 多项选择书中的这段代码返回 19

来自分类Dev

我的代码输出错误,我不明白为什么

来自分类Dev

我不明白为什么我的代码的“再玩”药水不起作用

来自分类Dev

不明白为什么斯威夫特要我露骨

来自分类Dev

不明白为什么我的NSString数据为空

来自分类Dev

不明白为什么我的|| 不管用

来自分类Dev

我不明白为什么这个循环死机了

来自分类Dev

不归还烧瓶,但我不明白为什么

来自分类Dev

我不明白为什么for循环不起作用

Related 相关文章

  1. 1

    我已经写了这段代码,但我不明白为什么它会像这样工作

  2. 2

    我不明白为什么这段代码在我的代码中以这种方式工作

  3. 3

    我不明白为什么Redirect()无法正常工作

  4. 4

    我不明白为什么charindex无法正常工作

  5. 5

    我不明白为什么我的冒泡排序代码无法正常工作

  6. 6

    我不明白为什么我的冒泡排序代码无法正常工作

  7. 7

    我不明白为什么我的波形是这样出来的

  8. 8

    我不明白为什么此代码无法正常工作!有人可以告诉我我做错了吗?

  9. 9

    我不明白为什么我的“如果”命令无法正常工作

  10. 10

    此do-while循环无法正常工作,我不明白为什么

  11. 11

    我不明白为什么这个@selector无法正常工作

  12. 12

    我不明白为什么我的验证中间件会这样

  13. 13

    为什么在Java中以下代码中Arrayindex越界?我已经检查了界限,但不明白为什么/

  14. 14

    不明白为什么 .stream() 工作正常但 .parallelStream() 不

  15. 15

    我不明白为什么我需要按特定顺序放置两行才能使其工作(递归)

  16. 16

    我不明白为什么我尝试时我的代码无法采用CSS

  17. 17

    我不明白为什么有些指针地址是这样的

  18. 18

    不明白为什么我的代码给我一个IndexError

  19. 19

    为什么我的代码连续打印两次?我不明白这个问题

  20. 20

    我的代码中出现KeyError:'',但我不明白为什么

  21. 21

    我不明白为什么我的 APCS 多项选择书中的这段代码返回 19

  22. 22

    我的代码输出错误,我不明白为什么

  23. 23

    我不明白为什么我的代码的“再玩”药水不起作用

  24. 24

    不明白为什么斯威夫特要我露骨

  25. 25

    不明白为什么我的NSString数据为空

  26. 26

    不明白为什么我的|| 不管用

  27. 27

    我不明白为什么这个循环死机了

  28. 28

    不归还烧瓶,但我不明白为什么

  29. 29

    我不明白为什么for循环不起作用

热门标签

归档