4

我正在编写这个很棒的应用程序,至少我认为它很棒,在 C 中与 GObject 的完美融合,过了一段时间我开始遇到这个非常非常奇怪的错误。我也相信已经注意到它并不总是出现。然而,这可能只是 IDE 的错。无论如何...

显然,GCC 抱怨:在 '*' 标记之前预期的 ')';这发生在头文件中。

这是相同的头文件。

#pragma once
#include "global.h"

#include "CharcoalApp.h"

GtkListStore *WebsitesListStore;

// that error is reported for this line
void charcoal_websites_list_initialize(CharcoalApp *app); 

据我所知,这来自CharcoalApp *app该函数的参数。

因为我无法真正理解为什么会发生此错误,所以我将包含该CharcoalApp.h文件。global.h是一个非常简单的头文件,承载了主要的依赖,主要有GLib、GObject、GThread、GTK+、WebKit等。

木炭应用程序.h


#ifndef __CHARCOAL_APP_H__
#define __CHARCOAL_APP_H__

#include "global.h"
#include "CharcoalDB.h"

#include "CharcoalWindow.h"
#include "CharcoalWebsitesList.h"

G_BEGIN_DECLS

#define CHARCOAL_TYPE_APP             (charcoal_app_get_type())
#define CHARCOAL_APP(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj), CHARCOAL_TYPE_APP, CharcoalApp))
#define CHARCOAL_APP_CONST(obj)       (G_TYPE_CHECK_INSTANCE_CAST((obj), CHARCOAL_TYPE_APP, CharcoalApp const))
#define CHARCOAL_APP_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass), CHARCOAL_TYPE_APP, CharcoalAppClass))
#define CHARCOAL_IS_APP(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), CHARCOAL_TYPE_APP))
#define CHARCOAL_IS_APP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), CHARCOAL_TYPE_APP))
#define CHARCOAL_APP_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS((obj), CHARCOAL_TYPE_APP, CharcoalAppClass))

typedef struct _CharcoalApp         CharcoalApp;
typedef struct _CharcoalAppClass    CharcoalAppClass;
typedef struct _CharcoalAppPrivate  CharcoalAppPrivate;

struct _CharcoalApp {
  GObject parent;

  CharcoalAppPrivate *priv;

  GtkBuilder *ui;
  CharcoalDB *db;

  // toplevels
  GtkWidget *CharcoalWindow;
};

struct _CharcoalAppClass {
  GObjectClass parent_class;
};

GType charcoal_app_get_type(void) G_GNUC_CONST;
CharcoalApp *charcoal_app_new(void);
void charcoal_app_quit(CharcoalApp *app);

G_END_DECLS

#endif /* __CHARCOAL_APP_H__ */

谢谢您的帮助!

4

5 回答 5

3

CharcoalApp未在 中声明global.h。假设您包含CharcoalApp.h在 C 文件中:

  1. CharcoalApp.h 被读取到 #include "global.h"
  2. 包含global.h
  3. 错误:在 '*' 标记之前应为 ')'

您应该正确重新排列头文件或使用前向声明(尽管我认为在这种情况下不需要)。


有很多解决方案:

  1. 正确的方法:包括来自global.h的CharcoalApp.h,而不是相反;
  2. 在CharcoalApp.htypedef struct _CharcoalApp CharcoalApp;中的 `#include "global.h" 之前移动;
  3. #include "global.h"CharcoalApp.h中删除并以正确的顺序包含它们(global.h 最后)。
于 2010-01-10T22:52:04.577 回答
1

怎么样:

#pragma once
#include "global.h"

//#include "CharcoalApp.h"
struct CharcoalApp;

GtkListStore *WebsitesListStore;

// that error is reported for this line
void charcoal_websites_list_initialize(CharcoalApp *app); 

它并不完全漂亮,但是删除包含在其他标题中的标题并用前向声明替换它们是我曾经被教导过并且总是尝试做的事情。

它显着减少了我在编译器上对循环依赖发誓的时间,并且在更改通常包含的头文件时也可以缩短构建时间。

: D

于 2010-01-10T23:15:39.660 回答
1

我不确定这是否对每个人都很明显,但我应该补充一点,它抱怨的原因(我认为)是因为它在解析该代码时不明白 CharcoalApp 是一个类型名称(我见过过去多次出现类似的编译时错误)。我认为它将它作为参数名称而不是参数的类型名称来处理,因此它期望参数列表(或逗号)的结尾而不是另一个没有逗号的参数名称。

于 2010-01-10T22:49:49.773 回答
0

在我看来GtkListStore没有定义。

于 2010-01-10T22:36:28.603 回答
0

尝试将您的代码更改为:

struct _CharcoalApp { 
  GObject parent; 

  CharcoalAppPrivate *priv; 

  GtkBuilder *ui; 
  CharcoalDB *db; 

  // toplevels 
  GtkWidget *CharcoalWindow; 
}; 

struct _CharcoalAppClass { 
  GObjectClass parent_class; 
};

typedef struct _CharcoalApp         CharcoalApp;
typedef struct _CharcoalAppClass    CharcoalAppClass; 
typedef struct _CharcoalAppPrivate  CharcoalAppPrivate; 

当你说出 typedef 时,底层结构类型还没有定义,这可能会混淆一些东西。

我通常只写如下内容:

typedef struct { 
  GObject parent; 

  CharcoalAppPrivate *priv; 

  GtkBuilder *ui; 
  CharcoalDB *db; 

  // toplevels 
  GtkWidget *CharcoalWindow; 
} CharcoalApp; 
于 2010-01-10T22:44:33.460 回答