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

标签 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
};

main 的标题:

stringdata.h

extern const unsigned char thestring[];

extern enum strsizes; //<-- how?

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

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

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

我已经尝试了很长时间来查找示例,但似乎没有一个是我要找的。我找到的解决方案涉及 C++ 模板元编程,但我严格使用 C。

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

最佳答案

您实际上可以这样做。

首先,在头文件中将您需要使用的所有字符串定义为宏,例如:

#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) 如果您不打算使用字符串的内容,请不要定义字符串变量,而是在编译时使用字符串常量来计算它的长度。如果您打算同时执行这两种操作,请通过将字符串常量定义为宏来将其用于这两种目的。

关于c - 如何在 C 中共享编译时生成的枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18753545/

相关文章:

c - 这是一个多么好的内存分配器?

c - 具有特殊按位运算的宏的目的是什么?

c++ - 作为基类模板参数的内部枚举

错误代码枚举的 C 命名建议

java - 从枚举返回字符串文字

c - 如何在 C 语言中获取当前语言环境的格式化日期和时间?

c - 带指针的双向链表段错误

c - *str 和 atoi(str) 的区别

c# - 使用反射创建枚举

c - C 中的默认枚举值是否对所有编译器都相同?