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

如何在C中共享编译时生成的枚举?,c,enums,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.h extern const unsigned cha

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

main.c

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

int main(int argc, char *argv[])
{
    print_somestring(thestring, (enum strsizes)stringlen);
    return 0;
}
主文件的标题:

stringdata.h

extern const unsigned char thestring[];

extern enum strsizes; //<-- how?
stringdata.h
外部常量无符号字符字符串[];

外部枚举标准化// 你可以做到这一点

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

#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;
}
#包括
#包括“headerfile.h”
外部列举标准;
int main(int argc,字符**argv){
printf(“长度为%d\n”,标准化);
返回0;
}
编译、链接并运行它。您将看到可以访问枚举的值。如果您objdump二进制文件,您将看到为enum变量分配的空间。但是您不会看到字符串本身出现在二进制文件中的任何地方,因为它的长度在编译时已经计算过,并且字符串的实际内容(到目前为止)在程序中的任何地方都没有使用过

关键是

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


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

为什么必须将其定义为枚举而不是全局常量?它显然不是一个符号常量,因为它是一个运行时值的长度实际上占用了存储空间。我可能会混淆术语,但我的意思是我希望能够在编译时定义常量,而这些常量实际上不使用任何空间…有点像智能定义。C是一种简单的语言,C预处理器更是如此。我想说你要求的太多了。你是说绝对没有办法做到这一点吗?编写一个简单的代码生成器,将它们直接写入头文件,并在编译之前让你的makefile立即运行生成器。我想他希望长度不占用任何存储空间,而不是字符串,在这种情况下,您不需要
enum
的实例,字符串本身显然可以在源文件中定义为
const char mystring[]=_字符串或类似。可以将长度减少为编译时常量,可能以相同的方式使用宏。或者他可以在
printf()
中直接使用
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;
}