【问题标题】:String constants in CC中的字符串常量
【发布时间】:2012-09-19 22:15:42
【问题描述】:

我想在我的 C 程序中定义用于多个文件的字符串常量。现在我以这种形式拥有它们:

file.h
#ifndef FILE_H_
#define FILE_H_

  static const char *id = "ID"

#endif

然而,虽然我在多个文件中使用了这个字符串,但我得到了一个编译器警告,说这个变量没有被使用。如果我删除 static 关键字,我会收到一条错误消息,指出该变量有多个定义。

我该如何解决这个问题?

【问题讨论】:

    标签: c compilation c-preprocessor c-strings


    【解决方案1】:

    要么 (a) 将它们定义为预处理器宏 #define ID "ID"(可能是 icky),要么 (b) 在一个源文件中定义它们并在头文件中声明它们 extern

    在头文件中调用它们的静态变量会导致它们出现在每个编译单元中,这是不可取的。

    【讨论】:

      【解决方案2】:

      您不应在头文件中定义变量,然后将其包含在多个源文件中。
      对于非静态变量,它会导致违反 One definition rule 并且链接器会抱怨。

      当您在标题中定义 static 时,您会得到包含该文件的每个翻译单元中的变量副本。这不能满足您在多个文件之间共享一个变量的要求。

      有两种方法可以解决您的问题:


      如果您想将其用作常量字符串,只需使用宏

      #define ID "ID"  
      

      并确保宏定义在您使用的任何地方都可见


      如果您想在多个文件中使用它作为变量,只需使用extern

      文件.h

      extern const char *id;
      

      file2.cpp

      #include"file.h"
      
      const char *id = "ID";
      

      file3.cpp

      #include"file.h"
      
      //Use the variable
      

      【讨论】:

      • 当我在 .h 文件中声明字符串 extern 并按照您描述的方式在 .c 文件中分配时,我收到一条错误消息,提示“重新定义“id””
      • @user1190650:如果您按照我提到的确切方式进行操作,则不应该这样做。
      【解决方案3】:

      至少,GCC 不会对静态非指针常量发出警告:

      static const char id[] = "ID";
      

      您的版本的问题在于它创建了一个字符串文字,然后“丢弃”了指向它的指针。

      【讨论】:

        【解决方案4】:

        我会使用一个宏 - 任何包含该头文件的文件都将其作为“常量”(它实际上只是在编译的预处理器阶段被替换):

        #define ID "ID"
        

        【讨论】:

          猜你喜欢
          • 2016-12-05
          • 1970-01-01
          • 2020-05-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多