【问题标题】:Including headers in header file doesn't make it included in implementation file - or am I just using wrong command to compile?在头文件中包含标头不会使其包含在实现文件中 - 还是我只是使用错误的命令进行编译?
【发布时间】:2012-01-04 13:17:07
【问题描述】:

嗯,我有一个如下所示的标题 (my_prog.h):

#ifndef __MY_HEADER_H
#define __MY_HEADER_H
#include <stddef.h>
typedef struct {
    size_t something;
    size_t something_else;
}
void my_func();
#endif

和我放置的实现文件(my_prog.c):

#include "my_prog.h"
static size_t min(size_t a, size_t b) {...}
void my_func() {...}

当我尝试将 my_prog.c 编译为目标文件(我需要它来链接其他文件)时,我觉得:

error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘min’

我用来编译的命令是:

gcc -c my_prog.c -o my_prog.h

没有错误说它找不到源。当我包含在实现文件中时,它会编译没有问题。

【问题讨论】:

  • 请发布复制问题的最小可编译代码。
  • 我试图重现您的问题。我没有收到该错误消息。我得到的是my_prog.h:8:1: error: expected ‘;’, identifier or ‘(’ before ‘void’。 (另外,我建议在使用gcc 编译时使用-Wall-Wextra。)
  • 请投票结束这个问题。正如@k_wisniewski 下面的评论所述,这是一个错误,因为使用了ifdef 而不是ifndef
  • 你在结构定义之后缺少了一个;

标签: c gcc compilation include


【解决方案1】:
  1. 从函数体中删除...。拥有它们是语法错误。

  2. 您尚未为结构指定 typedef 名称,并且缺少 ;

    typedef struct {
        size_t something;
        size_t something_else;
    } foo;
      ^^^^
    
  3. 在编译行中,在-o 之后指定头文件的名称。这是不正确的。如果编译顺利(如果您修复了上面的 1 和 2),编译器将擦除 my_prog.h 的原始内容并用目标文件覆盖它。而是这样做:

    gcc -c my_prog.c -o my_prog.o
    

【讨论】:

  • 好吧,这实际上是个愚蠢的问题。我添加了...只是说这里有一些我不想写的正文(因为它不重要)。真正的问题是,在我的真实代码中,我实际上有#ifdef 而不是#ifndef。这个话题可以关闭了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 2011-03-24
  • 1970-01-01
  • 2021-12-15
  • 2012-05-15
相关资源
最近更新 更多