【问题标题】:Implicit declaration of function with structs用结构隐式声明函数
【发布时间】:2021-12-18 03:58:22
【问题描述】:

我试图通过在我的头文件中创建原型函数来修复我最后一个函数的隐式声明。实验室是编写结构体,目前我有我的 Main.c、RandomNums.h 和 RandomNums.c。我在 RandomNums.c 中的功能已经完成,但我不确定我应该如何在 RandomNums.h 中编写它

下面是我的 RandomNums.c 文件,问题是 SetRandomVals 是 Main.c 中的隐式声明

struct RandomNums SetRandomVals(int low,int high) {
    struct RandomNums r;
    r.var1= (rand() % (high -low + 1)) + low;
    r.var2= (rand() % (high -low + 1)) + low;
    r.var3= (rand() % (high -low + 1)) + low;
     
    return r;
}

下面是我如何调用 SetRandomVals

RandomNums r = SetRandomVals(low, high);

我尝试过的原型是

SetRandomVals(int low,int high); 

至于我的教授,我可能不会编辑 Main.c 文件。

编辑:添加函数原型后,我的新错误是在它已经声明我有一个隐式声明之后我有一个未定义的引用。

/tmp/ccOhjlhD.o: In function `main':
main.c:(.text+0x63): undefined reference to `SetRandomVals'
collect2: error: ld returned 1 exit status

【问题讨论】:

  • 你同时拥有setRandomValsSetRandomVals 只是一个错字吗?
  • @Chris 是,感谢您注意到这一点

标签: c struct implicit-declaration


【解决方案1】:

原型应与定义中的函数头相同:struct RandomNums setRandomVals(int low,int high)

它应该在任何调用者调用函数之前声明。

【讨论】:

    【解决方案2】:

    返回类型需要包含在声明中。

    为此,您需要在.h 中包含结构定义。

    struct RandomNums { ... };
    
    struct RandomNums setRandomVals(int low, int high);
    

    顺便说一句,您可以通过使用(可能是匿名的)结构来避免在任何地方使用单词struct

    typedef struct { ... } RandomNums;
    
    RandomNums setRandomVals(int low, int high);
    

    【讨论】:

    • 有些人不同意最后一点; Linux kernel coding standardstypedef struct 几乎总是一个错误,而 C++ 认为没关系。
    • @Neil,关于“有些人不同意最后一点”,不,他们不同意。可以使用typedef 来避免在任何地方使用struct,这是没有争议的。但他们显然不同意这是一个好主意。我绝对反对类型定义指针,但是有人看到 RandomNums 是结构类型的问题让我感到困惑。
    • @Neil 这是主观的,Linux 是世界上少数坚持这种风格的代码库之一。除了风格问题,Linux 内核编码标准在其他方面就是一个笑话——一个业余级别的文档。然后我们可以查看 Linux 内核源代码本身。结论是,它几乎是地球上最后一个人们应该去寻找关于如何编写正确 C 的规范参考的地方......
    • 很公平。但是,与C++ 不同的是,至少应该知道,它正在向typedef-命名空间导出附加内容,这与标记命名空间不同。
    • @Neil,说名字是foo 而不是struct foo 是一种奇特的方式。我希望如此。这就是重点。
    猜你喜欢
    • 2021-11-20
    • 2012-07-19
    • 2016-12-28
    • 2021-01-20
    • 2014-06-28
    • 1970-01-01
    • 2018-06-11
    • 2022-01-16
    相关资源
    最近更新 更多