【问题标题】:C - Very Strange Implicit DeclarationC - 非常奇怪的隐式声明
【发布时间】:2013-02-01 03:25:39
【问题描述】:

我在文件“draw.h”中有一个函数:

void TileSystem() {
    // Some code here.        
}

在“main.c”文件中,我称之为它,因为我在文件中#included“draw.h”。功能很好用!!

然后,我决定将函数重命名为

void CreateTileSystem() {
    // Some code here.        
}

我得到以下输出:

gcc main.c -std=c99 -o main `pkg-config --cflags --libs allegro-5.0 allegro_acodec-5.0 allegro_audio-5.0 allegro_color-5.0 allegro_dialog-5.0 allegro_font-5.0 allegro_image-5.0 allegro_main-5.0 allegro_memfile-5.0 allegro_physfs-5.0 allegro_primitives-5.0 allegro_ttf-5.0`
main.c: In function ‘main’:
main.c:217:12: warning: implicit declaration of function ‘CreateTileSystem’ [-Wimplicit-function-declaration]
/tmp/cclNEg6q.o: In function `main':
main.c:(.text+0xb1e): undefined reference to `CreateTileSystem'
collect2: error: ld returned 1 exit status
make: *** [main] Error 1

然后,我只是将它重命名回 TileSystem 并且运行良好。我在整个代码中没有其他引用。这根本没有意义!我想重命名,以便在函数中使用动词(我认为这是一个更“正确”的标准)。好吧,我真的很想知道会发生什么。我真的找不到错误,而且当我重命名它时,它又恢复了工作,这让我更加沮丧。

非常感谢!

【问题讨论】:

  • 你不应该在头文件中添加函数体,只添加签名,并将函数体放在单独的 c/cpp 文件中。
  • 我以这种方式调用 TileSystem();,并且可以工作。然后,我这样调用CreateTileSystem();,还是不行。
  • 问题可能出在 THE NAME 上?我不知道,可能是一些随机内存问题......但我得到了相同的结果,将函数更改为 int 或 float 等。
  • 我的猜测是 main.c 中有一个重新声明的 TileSystem 正在生效。生成预处理文件以查看编译器看到的内容。

标签: c declaration implicit


【解决方案1】:

您还必须更改头文件中的名称draw.h

该错误/警告表明该函数没有前向声明,在较早的 C 方言中,这会导致假设该函数为 int fn(int)(如果有记忆的话)。

当你改回它时它会起作用,因为标题从未被修改过,所以它仍然提供旧名称的前向声明。

【讨论】:

  • 只是吹毛求疵; C99 取消了隐式 int。
【解决方案2】:

我尝试创建几个您在此处描述的简单文件,但没有遇到任何问题。所以:

  • 您确定在 draw.h 和 main.c 中为新函数使用了相同的名称(确定)?

  • 我不知道allegro:它里面有没有一个叫做TileSystem的函数?

除此之外,我建议从基本设置开始(所以只有 include、main 函数和 main.c 中的调用,以及 draw.h 中的声明),确保使用 @987654321 编译@,然后将您的应用程序逐步构建到当前状态,直到错误再次开始发生。这应该可以帮助您确定问题的根源。

【讨论】:

  • 我会这样做的,谢谢!是的,它们具有完全相同的名称,并且 Allegro 中没有名为“TileSystem”的函数。当我尝试以这种方式调用它时,我得到了一些有趣的输出:extern CreateTileSystem();。当我这样做时,输出是不同的:警告:'CreateTileSystem'声明中的类型默认为'int' [默认启用] 由于某种原因,我认为 CreateTileSystem 没有识别它的类型(它忽略了 void,或者类似的东西,默认为int)。好吧,名字没有错。我会按照你说的去做,试图找到问题:)。
【解决方案3】:

我重新创建了头文件,没有更改任何内容,并且成功了。这确实与我从不更改文件有关(我的意思是,重命名文件或排除它)。发生了一些非常地下的编译问题。

【讨论】:

    猜你喜欢
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    相关资源
    最近更新 更多