gpt4 book ai didi

c - 函数声明对于 C 编程来说是必不可少的吗?

转载 作者:行者123 更新时间:2023-12-02 07:04:22 25 4
gpt4 key购买 nike

我曾经认为我们应该在使用之前声明一个在另一个文件中定义的函数,但最近由于编程经验,我改变了我的思维方式。对于三个文件,CASM:

ma​​in.c

extern test_str;
/*extern myprint*/ --> If I add the line, gcc will report an error: called object ‘myprint’ is not a function
void Print_String() {
myprint("a simple test", test_str);
}

内核.asm

extern Print_String

[section .text]
global _start
global test_str
test_str dd 14
_start:
call Print_String
jmp $

另一个.asm

[section .text]
global myprint
myprint:
mov edx, [esp + 8]
mov ecx, [esp + 4]
mov ebx, 1
mov eax, 4
int 0x80
ret

编译

nasm -f elf another.asm -o another.o
gcc -c -g main.c -o main.o
nasm -f elf kernel.asm -o kernel.o
ld -o final main.o kernel.o another.o

结果

./final 
a simple test

在我看来,如果我想在 main.c 中使用函数 myprint,我应该使用 extern 声明它 ,因为 myprint 是在另一个文件中定义的,结果却恰恰相反。正如上面的 main.c 所示。如果我添加 extern myprint 行,我会得到一个错误。但是,如果没有该声明,我将得到正确的结果。还有,我没有在main.c中定义函数myprint,为什么我可以使用那个函数?难道我不应该事先声明吗?

最佳答案

当您在没有原型(prototype)的情况下调用函数时,编译器会对该函数的参数做出一些假设和猜测。所以你应该声明它,但是把它声明为一个函数:

void myprint(const char *, const char *); /* Or whatever. */

关于c - 函数声明对于 C 编程来说是必不可少的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14890076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com