如何在C中共享编译时生成的枚举?

时间:2013-09-12 00:39:41

标签: c enums

在一个简单的例子中,我有两个源文件......一个使用特定字符串,如下所示:

main.c

#include <stdio.h>
#include "stringdata.h"

int main(int argc, char *argv[])
{
    print_somestring(thestring, (enum strsizes)stringlen);
    return 0;
}

然后这个:

stringdata.c

const unsigned char thestring[] = "This is a string\n";

enum strsizes
{
    stringlen = sizeof(thestring) - 1 //to account for the null byte
};

主要标题:

stringdata.h

extern const unsigned char thestring[];

extern enum strsizes; //<-- how?

现在,我试图编译它,我得到了我的预期...它不喜欢它。主要问题是能够让枚举“看到”实际定义的字符串,以便sizeof正确评估;单独的extern符号没有给出足够大的信息,因此我必须在每个编译单元中声明和初始化字符串,这显然会破坏。

我理解通常,你会在标题中定义枚举类型,然后在你需要的地方使用常量。在这种情况下,常量的值取决于编译时条件(字符串的评估“字节”大小)。

为了在其他编译单元中使用这些常量,我需要枚举类型定义“粘贴”,如果你愿意的话。显然,外部人员不会这样做。通过使用真实类型i使常量占用实际存储空间。即const int是我想要避免的。

我已经尝试了很长一段时间来查找示例,但它们似乎都不是我想要的。我发现的解决方案涉及C ++模板元编程,但我严格使用C.

如果有人能帮助我,请提前感谢(这将对我的项目产生其他非常有益的影响)。

1 个答案:

答案 0 :(得分:2)

你实际上可以这样做。

首先,使用头文件中的宏来定义执行此操作所需的所有字符串,例如:

#define THE_STRING "This is a string\n"

然后在头文件中为您的枚举创建一个typedef,或者包含它的那个:

typedef enum {
    stringlen = sizeof(THE_STRING) -1 
} the_enum_t;

现在在某个C源文件中分配一个枚举实例

#include "headerfile.h"

the_enum_t strsizes = stringlen;

最后在其他文件中,使用它:

#include <stdio.h>
#include "headerfile.h"

extern the_enum_t strsizes;

int main (int argc, char ** argv) {
  printf("length is %d\n", strsizes);
  return 0;
}

编译并链接并运行它。您将看到您能够访问枚举的值。如果你objdump二进制文件,你会看到为枚举变量分配的空间。但是你不会看到字符串本身出现在二进制文件的任何地方,因为它的长度已经在编译时进行了评估,并且字符串的实际内容(到目前为止)在程序中的任何地方都没有使用过。

关键点是

1)如果要在文件之间共享自定义数据类型,请创建一个typedef,然后共享它的实例。

2)如果您不打算使用字符串的内容,请不要定义字符串变量,而只是在编译时使用字符串常量来计算它的长度。如果您打算同时执行这两个操作,请将字符串常量用于两个目的,方法是将其定义为宏。