C 对象出现在文件中的顺序重要吗?
例如,在函数中,如果我创建两个函数并且上面的一个引用另一个函数,它会起作用吗? (是的,我试过了。)
对于静态函数、INLINE 函数等是否同样有效?
对结构是否同样有效?如果我引用在 .c 文件中进一步定义的结构,会发生什么?
这是任何特定于编译器的扩展吗?在这种情况下,编译器如何工作?它是否首先扫描整个文件的所有声明/定义,然后尝试取消引用函数/符号?
最佳答案
第一,如果通过“如果我创建两个函数并且上面的一个引用另一个函数,它会起作用吗?”你的意思是这样的:
int foo()
{
return bar();
}
int bar()
{
return 0;
}
然后编译器可能会对
bar()
是什么进行有根据的猜测,但如果 bar()
尚未声明,它至少会发出警告。对于无法调用的符号(如变量或类型),如果在声明之前使用它们,则是一个彻头彻尾的错误。在 C 中,无论何时使用标识符(无论标识符的种类如何:它可以是函数、变量、类型等),都应该事先声明。您可以添加到任何标识符的各种修饰符(如您所说的
static
、 inline
和所有其他修饰符)对此没有影响。不要混淆声明和定义。声明只是告诉编译器一个名字存在;定义实际上告诉编译器它是什么。
例如,这是一个定义:
int bar() { return 4; }
注意它是如何有一个主体的,里面有(简单的)代码。
这是匹配的声明:
int bar();
编译器一旦看到函数的声明或定义,就会很乐意接受它的使用。出于组织原因和更好的灵活性,通常最好在 C 文件的顶部(或包含的头文件中)为所有函数编写声明,然后是定义。
所以,我的第一个例子应该是这样的:
int foo();
int bar();
int foo()
{
return bar();
}
int bar()
{
return 0;
}
使用 C 代码上方的声明,我可以以任何我喜欢的方式更改函数的顺序。
关于c - C 对象的顺序重要吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6319702/