-1

是否可以在最初定义的文件中扩展宏?我的意思是,如果我这样做:

    #define DEFINE_SAMPLE_CLASS(name) \
    typedef struct{ \
        int example_int; \
    } name; \

我希望它在我定义这个宏的原始文件中展开。这可能吗?我想这样做的原因是因为我希望用户能够定义一堆类似模板的类,但是一旦他们定义了它们,我希望它们能够从其他文件中使用,而不必包含一堆其他头文件来获取他们想要的类型。如果这不可能或不切实际,有没有更好的方法呢?

编辑:澄清

我基本上想要做的是允许用户“添加到”头文件,以便他们可以声明类似于上面示例的内容:

DEFINE_SAMPLE_CLASS(Sample1)

这将扩展为:

    typedef struct{
        int example_int;
    } Sample1;

然后其他文件可以使用这些“全局”定义,而不必包含定义它们的所有文件。我希望用户能够定义他们自己的这些类的版本,同时保持它们“全局”,而不必编辑原始标题。

4

3 回答 3

1

我希望它在我定义这个宏的原始文件中展开。这可能吗?

是的。在你的头文件中,把

#define DEFINE_SAMPLE_CLASS(name) typedef struct name name
DEFINE_SAMPLE_CLASS(Sample1);

完成...现在 Sample1 可以用作任何包含头文件的源文件中的类型。

于 2013-10-19T01:27:38.720 回答
1

作为Jim Balter's answer的替代方案,您可以执行以下操作:

/* header file */
#pragma once

#define DEFINE_SAMPLE_CLASS(name) \
typedef struct{ \
    int example_int; \
} name

#include "sample_class_definitions.h"

然后,该文件sample_class_definitions.h可以是脚本生成的文件,人们只需将他们想要定义的类的名称添加到某个 make 脚本中即可。或者,用户可以将适当的DEFINE_SAMPLE_CLASS(...)代码行添加到该头文件中。

于 2013-10-19T02:14:36.717 回答
0

在评论中回答您的问题:(另请阅读此处以了解有关外部使用的精彩讨论。)

像这样声明结构,然后将其复制(或任何变量)允许它包含相同的值,并在所有使用它的文件中看到相同的值。

在.h

typedef struct {
    int a;
    char *b;
}A: 
//A has just been created as a new type, i.e. struct A, so it now conforms to the same rules other variable conform to with regards to the use of extern.  So...  

extern A a, *pA;//create a global copy of A with extern modifier  

然后在file1.c

A a, *pA;  //copy of externed variable 
int main(void)
{
    pA = &a;//initialize pA here, use everywhere in file;
    return 0;
}  

然后在file2.c

A a, *pA;

[编辑] 我的原始答案没有改变,并且确实回答了 OP 提出的一个非常具体的问题:澄清我的评论:

做 typedef struct {...} A; 这样的事情不是那么容易吗?外部 A a, *pA; 在你的头文件中,然后是 A a, *pA; 在每个 .c 模块中您需要使用它们吗?我认为对于以后必须维护代码的人来说更具可读性

OP问:

@ryyker:您能澄清一下您发布的外部示例吗?这让我很困惑,因为结构在 c 中没有链接,但所有变量和函数都有。

上面的请求得到了回答。OP接受了答案。此编辑是为了回应@Jim Balter 关于我的答案有效性的激进投诉/声明。新代码已经过清理和测试,以说明使用 extern 修饰符创建和使用项目可见变量的用法。下面的代码示例将演示:

头文件.h

int somefunc(void);
typedef struct {
    int num;
    char *b;
}A; 
//A has just been created as a new type, i.e. struct A, so it now 
//conforms to the same rules other variable conform to with 
//regards to the use of extern.  So...  

extern A a, *pA;//create a global copy of A with extern modifier    

文件1.c

#include <ansi_c.h>
#include "header.h"

A a, *pA;
int main(void)
{
    pA = &a;//initialize pA here, use everywhere in file;
    pA->num = 45;
    pA->b = malloc(strlen("value of pA->b")+1);
    somefunc();
    printf("value of pA->b is: %s\n", pA->b);
    getchar();
    free(pA->b);
    return 0;
}  

文件2.c

#include <ansi_c.h>
#include "header.h"

A a, *pA; //Note: optional presence of A in this file.  
          //It is not Not necessary to place this line, 
          //but for readability (future maintainers of code
          //I always include it in each module in which it is used. 
int somefunc(void)
{
    printf("%d\n", pA->num);//value of pN->num same as in file1.c 
    strcpy(pA->b, "value of pA->b");
    return 0;
}

构建和运行这些文件将展示A 结构创建的header.h 的项目
可见性 ,并在 file1.c 和 file2.c 中使用(以及所需的尽可能多的 .c 文件)
它还证实了我在我的原始答案。

于 2013-10-19T01:23:34.797 回答