Tag: 函数声明

也是C中的声明符(在参数声明中使用时)吗?

6.7.6声明者说 每个声明符声明一个标识符 ,并断言当与声明符相同的表单的操作数出现在表达式中时,它指定一个函数或对象,其范围,存储持续时间和声明说明符指示的类型。 并且还说明了参数的语法 : parameter-declaration: declaration-specifiers declarator declaration-specifiers abstract-declarator(opt) 对于给定的函数原型 int f( int a[], int n); int a[]使用声明符a int a[]声明一个参数,声明一个标识符a 。 如果是的话 int f( int [], int n); int [] declares参数是一个int数组,没有标识符。 []也是声明者吗? (我认为不是因为它没有声明标识符,但参数的语法表明它是!)

隐式函数声明和链接

最近我在C中学习了隐式函数声明。 主要观点很明确,但在这种情况下我对理解联系过程有些麻烦。 请考虑以下代码(文件ac ): #include int main() { double someValue = f(); printf(“%f\n”, someValue); return 0; } 如果我尝试编译它: gcc -c ac -std=c99 我看到关于函数f()隐式声明的警告。 如果我尝试编译和链接: gcc ac -std=c99 我有一个未定义的引用错误。 一切都很好。 然后我添加另一个文件(文件bc ): double f(double x) { return x; } 并调用下一个命令: gcc ac bc -std=c99 令人惊讶的是,一切都成功地联 当然在./a.out调用后我看到了垃圾输出。 所以,我的问题是:如何将隐式声明函数的程序链接起来? 在编译器/链接器的引擎下我的例子会发生什么? 我读了很多关于SO的话题, 这个和这个但仍然有问题。

奇怪的C函数声明

当我在其中一个源文件中遇到这个时,我正在浏览一些代码。 int st_insert(table, key, value) register st_table *table; register st_data_t key; st_data_t value; { unsigned int hash_val, bin_pos; register st_table_entry *ptr; hash_val = do_hash(key, table); FIND_ENTRY(table, ptr, hash_val, bin_pos); if (ptr == 0) { ADD_DIRECT(table, key, value, hash_val, bin_pos); return 0; } else { ptr->record = value; return 1; } } 这种风格是什么? 这是一种声明函数的模糊方法吗? 有没有什么理由可以使用它而不是正常的函数声明?

extern声明和函数定义都在同一个文件中

我只是浏览gcc源文件。 在gcc.c ,我找到了类似的东西 extern int main (int, char **); int main (int argc, char **argv) { 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中但是会在项目的其他地方找到。 但是在这里, main定义是在extern声明之后。 那么extern声明服务的目的是什么? 看起来,在这个具体的例子中, extern似乎表现得像我们在汇编中使用的export ,我们在模块之外输出一个特定的符号 有任何想法吗?

K&R风格函数定义问题

以下代码有效: int main() { void foo(int); foo(3); return 0; } void foo(a) int a; { printf(“In foo\n”); } 但这个不是: int main() { void foo(float); foo(3.24); return 0; } void foo(a) float a; { printf(“In foo\n”); } 为什么会这样?

函数没有在C中指定的返回类型

我在C中遇到了这段代码: #include main( ) { int i = 5; workover(i); printf(“%d”,i); } workover(i) int i; { i = i*i; return(i); } 我想知道函数“修井”的声明是如何有效的? 当我们没有提到函数的返回类型时会发生什么? (我们可以返回任何东西吗?)。参数也只是一个变量名,这是如何工作的?

为什么空声明适用于带有int参数的定义但不适用于浮点参数?

我认为区别在于declaration没有参数类型…… 为什么这样做: int fuc(); int fuc(int i) { printf(“%d”, i); return 0; } 但这无法编译: int fuc(); int fuc(float f) { printf(“%f”, f); return 0; } 随着消息: 错误:’fuc’的冲突类型。 注意:具有默认促销的参数类型不能与空参数名称列表声明匹配

函数声明中的最大参数数

我知道函数定义中参数的最小数量为零,但函数定义中的最大参数数量是多少? 我只是为了知识和好奇而问这个问题,而不是我要写一个真正的function。