【问题标题】:Declaring enum in a header, invisible in source file?在头文件中声明枚举,在源文件中不可见?
【发布时间】:2012-02-20 11:06:34
【问题描述】:

在源文件(来自共享对象/DLL)中,我得到OKAY could not be resolved,尽管它在标题中。标头在另一个项目中,但我认为这不应该相关,因为 ppackage 已正确解析?

更新,这里是来源:

构建项目的输出。

make all 
Building file: ../src/foor.c
Invoking: GCC C Compiler
gcc -I"/home/lk/proj/m5/m5/src/include" -O0 -g3 -Wall -c -fmessage-length=0 -fPIC -MMD -MP -MF"src/foor.d" -MT"src/foor.d" -o "src/foor.o" "../src/foor.c"
In file included from ../src/foor.c:9:0:
/home/lk/proj/m5/m5/src/include/m5.h:33:3: warning: #warning ohshit
../src/foor.c:12:1: warning: missing braces around initializer
../src/foor.c:12:1: warning: (near initialization for 'fs[1]')
Finished building: ../src/foor.c

Building target: libfoor.so
Invoking: GCC C Linker
gcc -shared -o "libfoor.so"  ./src/foor.o   
Finished building target: libfoor.so

标题:

#include <stdio.h>

enum {
    OKAY = 0,
    ERR,
    ERRANY,
    // list shortened
    ERRNOTFOUND,
};

typedef struct { ..foobars.. } ppackage;

源文件:

#include <header.h> // Did add -I ../include, where the header is

ppackage knock(ppackage *in)
{
    return OKAY; // ERROR
}

【问题讨论】:

  • 你应该使用#include ""而不是#include &lt;&gt;作为你自己的头文件并保留&lt;&gt;作为系统文件
  • 然后我将不得不创建链接,这是非常不便携甚至更脏的,因为我有很多项目。但是是的,它应该是。除了这是跨项目标题。奇怪的是,没有共享库/DLL 的主程序可以工作(可以使用OKAY 和所有东西),与此处显示的源文件相反,它只能使用结构......
  • 根据你上传到github的目录结构,你应该使用-I include而不是-I ../include,因为源文件和include目录在同一个目录。
  • @ChrisBrowne 我简化了它。 ppackage 仍然可以在 foor 中使用,并且我在标题上没有收到错误。实际包含是正确的。但我还是不明白。
  • 我在您的编译器输出中看不到错误。我所看到的只是一个警告,您告诉编译器在某一行生成。宏 OKAY 没有任何内容。

标签: c dll enums header shared-libraries


【解决方案1】:

如果您包含标头,那么该标头中的所有代码也可以粘贴到您的 C 源文件中 #include 指令所在的位置。

它不起作用听起来很奇怪。

要做的一件事是使用引号而不是尖括号来包含,因为您要包含第 3 方标头。

另外,请包括准确的编译器输出。

【讨论】:

  • 我想这已经足够详细了 =D ?
  • 由于您使用的是 GCC,请尝试仅运行 C 预处理器:而不是“-c”,使用“-E -P”并将输出重定向到“foor.i”。 (“-P”选项去掉了行号指令。)现在简单地编译:“gcc -c foor.i”。这将为您提供“foor.i”中发生错误的行号,您可以查看完全预处理的代码以了解问题所在。
  • @AlexMeasday 为什么没有“最喜欢的评论”按钮...非常感谢!
【解决方案2】:

尚不清楚,您的枚举与 ..foobars.. 相关。

Ppackage knock(ppackage *in) 应该有一个 ppackage 类型的返回值,它是一个 struct { ..foobars..}

   typedef enum {
    OKAY = 0,
    ERR,
    ERRANY,
    // list shortened
    ERRNOTFOUND,
   } preturnvalue_t;

有一个功能

   preturnvalue_t knock(ppackage *in)
   { 
      return OKAY; // ERROR
   }

做你需要的?

卢兹

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 2013-01-04
    相关资源
    最近更新 更多