我们可以在函数内修改函数原型吗?

时间:2017-09-07 09:15:26

标签: c

我在C中声明如下:

$newkey='myNewKey';
$newval='myNewValue';
foreach($results as &$row){ //use reference variable 
  $row[$newkey] = $newval;// remove the second  foreach if not necessary
  //if second foreach is necessary then add it no problem
}

是否可以实施此类代码? C将如何允许我们这样编码? 函数调用abcd()会将'q'作为char还是整数?

3 个答案:

答案 0 :(得分:8)

C11 6.2.7p2

  

引用同一对象或函数的所有声明都应具有兼容类型;否则,行为未定义

void abcd(int, char);是一个外部声明,其中abcdintchar作为参数。它与extern void abcd(char);不兼容,char表示同一个函数现在只需要一个void abcd_c(char x){}; void abcd_i(int x){}; int main(int argc, char *argv[]) { #define abcd abcd_c abcd('t'); abcd('e'); abcd('s'); abcd('t'); #undef abcd #define abcd abcd_i abcd(123); #undef abcd } 作为参数。

如果我正确读取标准,这不是约束错误,因此编译器不需要为此生成警告。它仍然是破碎和错误的。

答案 1 :(得分:2)

抱歉,我忽略了C而不是C ++标签(删除了C ++的东西)。我认为这应该在C:

#define/#undef

您只需使用{{1}}在代码部分中选择想要的行为

答案 2 :(得分:2)

我相信在C中你不能这样做。实际上编译器甚至都不会“哭”,因为这在语法上是正确的。但另一方面,这是错误的,不会执行。就个人而言,我非常关注编译器接受的错误但会破坏执行。 一般来说,在这种情况下,您必须使用正确的参数,字符在main之上声明此函数。因为C会查找这个特定函数的声明,但她找不到它。 在C ++中,它很容易,因为你可以重载函数,编译器只能从参数类型中理解。