我们å¯ä»¥åœ¨å®šä¹‰ä¹‹å‰è°ƒç”¨å‡½æ•°å—?

时间:2014-01-31 18:54:15

标签: c function

#include <stdio.h>

void main()

{

    m();

}

void m()

{

    printf("hi");

}

输出

hi

警告

main.c:11:10: warning: conflicting types for 'm' [enabled by default]
     void m()
          ^
main.c:7:9: note: previous implicit declaration of 'm' was here
         m();
         ^

为什么这个程åºæˆåŠŸè¿è¡Œï¼Œå³ä½¿m()在定义之å‰è¢«è°ƒç”¨äº†ï¼Ÿ 警告的å«ä¹‰æ˜¯ä»€ä¹ˆï¼Ÿ

6 个答案:

答案 0 :(得分:7)

如果你没有在K&amp; RC / C89中声明一个函数,它会被éšå¼å£°æ˜Žä¸ºè¿”回int。由于您的回å¤void,因此存在ä¸åŒ¹é…。

如果您添加原型:

void m(void);

......在它被å¬å”¤ä¹‹å‰ï¼Œå®ƒä¼šè§£å†³é—®é¢˜ã€‚

答案 1 :(得分:6)

C89å…许通过将传递给它的函数和å‚数的返回类型éšå¼è½¬æ¢ä¸ºintæ¥å®žçŽ°ã€‚请å‚阅here。

但是,这在C99åŠæ›´é«˜ç‰ˆæœ¬ä¸­æ— æ•ˆã€‚标准中çœç•¥äº†è¿™ä¸€ç‚¹ã€‚您必须为函数声明原型或在main之å‰å®šä¹‰å®ƒã€‚查看结果here。在这ç§æƒ…况下存在编译时错误。

答案 2 :(得分:3)

ä¸ï¼Œä½†ä½ å¯ä»¥å£°æ˜Žï¼š

#include <stdio.h>

// declare m()
void m();

void main()
{
    // use m()
    m();
}

// define m()
void m()
{
    printf("hi");
}

答案 3 :(得分:2)

函数声明需è¦åœ¨ç¬¬ä¸€æ¬¡è°ƒç”¨å‡½æ•°ä¹‹å‰æ·»åŠ ã€‚ 完整声明包括返回类型以åŠå‚æ•°çš„æ•°é‡å’Œç±»åž‹ã€‚这也称为函数原型。

所以你缺少功能原型。

将函数声明void m();添加到代ç ä¸­ã€‚

修改

C程åºå…许使用forward declaration 。

  

在您的情况下,void m();表示函数的å‰å‘声明,是函数的原型。处ç†å®Œæ­¤å£°æ˜ŽåŽï¼Œç¼–译器将å…许用户在程åºçš„其余部分中引用实体m。

     

必须在æŸå¤„æ供函数的定义(相åŒçš„文件或其他文件,链接器负责将一个或多个目标文件中的特定函数的引用与其定义正确匹é…,其定义必须是唯一的,在å¦ä¸€ä¸ªä¸­ï¼‰ :(æ¥è‡ªç»´åŸºç™¾ç§‘页é¢ï¼‰

这就是在你的程åºä¸­ä¸»è¦å·¥ä½œä¹‹åŽå®šä¹‰å‡½æ•°çš„原因。

答案 4 :(得分:2)

是 - 使用原型进行调用。

å³ã€‚把

void m();

在文件的开头

答案 5 :(得分:1)

我会说,是的。

但我想纠正你,并说明在 之å‰å¯ä»¥è°ƒç”¨ï¼ˆè°ƒç”¨ï¼‰æŸäº›å‡½æ•°ï¼ˆHOISTING)。

我想写的两ç§ä¸åŒç±»åž‹çš„函数是:

表达功能&amp;å‡é€ŸåŠŸèƒ½

1-表达å¼å‡½æ•°ï¼šå‡½æ•°è¡¨è¾¾å¼å¯ä»¥å­˜å‚¨åœ¨å˜é‡ä¸­ï¼Œå› æ­¤å®ƒä»¬ä¸éœ€è¦å‡½æ•°å称。它们也将被命å为匿å函数(没有å称的函数)。è¦è°ƒç”¨ï¼ˆè°ƒç”¨ï¼‰ï¼Œä»–们总是需è¦ä½¿ç”¨å˜é‡å。如果在定义之å‰è°ƒç”¨ï¼Œåˆ™è¿™äº›å‡½æ•°ä¸ä¼šèµ·ä½œç”¨ï¼Œè¿™æ„味ç€æ­¤å¤„ä¸ä¼šå‘生æå‡ã€‚我们必须首先定义表达å¼å‡½æ•°ç„¶åŽå†è°ƒç”¨å®ƒã€‚

let lastName = function (family) {
 console.log("My last name is " + family);
};        
let x = lastName("Lopez");

这是你在ES6中写的方å¼ï¼š

lastName = (family) => console.log("My last name is " + family);
x = lastName("Lopez");

2-å‡é€ŸåŠŸèƒ½ï¼šä½¿ç”¨ä»¥ä¸‹è¯­æ³•å£°æ˜Žçš„功能ä¸ä¼šç«‹å³æ‰§è¡Œã€‚它们被ä¿å­˜ä»¥ä¾›ä»¥åŽä½¿ç”¨ï¼†ï¼ƒ34;,并且在它们被调用(被调用)时将被执行。如果你在定义它们之å‰æˆ–之åŽè°ƒç”¨å®ƒä»¬ï¼Œè¿™äº›ç±»åž‹çš„函数都有效。如果在定义之å‰è°ƒç”¨å‡é€ŸåŠŸèƒ½ - æå‡ - 正常工作。

function Name(name) {
  console.log("My cat's name is " + name);
}
Name("Chloe");

åŠè£…示例:

Name("Chloe");
function Name(name) {
   console.log("My cat's name is " + name);
}