2011-11-02 59 views
2
struct info _info; 

#define INIT(a, b, c, d)     \ 
    struct info _info = {a, b, c, d} 

这个工作用C的工作,但与G ++我得到:在头初始化宏中的一个结构,必须在C和C++源

error: redefinition of ‘info _info’

INIT并不总是叫,有时_info会以其他方式初始化,这就是为什么这两种方式都必须坚持。

语境:

我使用INIT中,这是获得与G ++编译的文件,但我还用它了GCC编译的文件。所以问题是:我需要这个头文件代码在两种语言中工作,而不管我是在c库还是在C++库中使用头文件。

Kerrek指出,我可以用#ifdef来,所以我这样做:

#ifndef __cplusplus 

struct info _info; 
#define INFO(a, b, c, d)     \ 
    struct info _info = {a, b, c, d} 

#else 

struct info _info; 
#define INFO(a, b, c, d)     \ 
      _info = {a, b, c, d} 
#endif 

但它仍然是行不通的,我在我使用宏行得到一个error: ‘_info’ does not name a type 我的cpp项目: INFO("Information", 2 ,"again", 4)

+2

请提供您使用'INIT'宏观和它失败的上下文。另外,你是否100%确定你没有忘记宏定义中的反斜杠(这将与错误一致)?请复制并粘贴实际的错误代码。 –

+0

@ AlexandreC.I补充说明我需要它在C++和c中工作 – Blub

+1

注意:以下划线开头的名称在许多情况下都被保留,我邀请您切换到另一个命名约定。 –

回答

3

在C++中,变量声明中不要说struct。下面应该工作:

struct info { int x, y, z, w; }; // type definition (elsewhere in your code) 

#define INIT(a, b, c, d) info _info = {a, b, c, d} 

INIT(1,2,3,4); 

因为变量名是固定的,这个宏只能使用一次,任何给定的范围,这是不明显内部使用。为了更灵活,我的变量名称添加到宏:

#define DECLARE_AND_INIT(var, a, b, c, d) info var = {a, b, c, d} 
DECLARE_AND_INIT(my_info, 4, 5, 6, 7); 
+0

我需要它在C++和c中工作,我将包含在头文件中的代码包含到c和C++项目中。对不起,我不清楚。 – Blub

+0

错......什么?使用两种不同的语言?我可以使用'__cplusplus'条件宏。 –

+1

@KerrekSB,使用'struct info'与在C++中使用普通的'info'一样有效。 – avakar

0

如果我没有记错正确,您可以使用typedef,避免__cplusplus特定部分。

typedef struct taginfo { int x, y, z, w; } info; 
info _info; 
#define INFO(a,b,c,d) _info = {(a), (b), (c), (d)} 

...这应该在C和C++都有效。

Why should we typedef a struct so often in C?