【问题标题】:c++ How could I properly predefined array of char*?c++ 如何正确预定义 char* 数组?
【发布时间】:2010-12-14 20:12:47
【问题描述】:

我就是这样做的:

int argc = 9;
char* argv[argc];

argv[0] = "c:/prog.exe";

但我注意到它已被弃用。有什么更好的方法?

【问题讨论】:

  • 这实际上不是有效的 c++。使用变量来声明堆栈上数组的大小是较新的 C 标准的一部分,该标准尚未与最新的 C++ 标准集成。你确定你使用了正确的标签吗?
  • @Noah Roberts:这可能是编译器实现的语言扩展(这可以解释为什么不推荐使用它)。
  • 就标准而言不是“集成的”。但是主要的编译器都支持这个,所以我会很顺利地处理这个(顺便说一句,这不是 OP 的问题)。
  • 警告与 VLA 完全无关,请参阅我的帖子和 Vlad 的。
  • @In silico - 不,不推荐使用的是非常量字符串文字。在 03 中被标准弃用。

标签: c++ c constants string-literals


【解决方案1】:

您必须将其设为 const:

const char *argv[] = { "Arg1", "Arg2", "..." };

...或者不使用常量字符串文字:

int argc = 9;
char* argv[argc];
char prog_name[] = "c:/prog.exe";
argv[0] = prog_name;

【讨论】:

    【解决方案2】:

    除了对数组大小使用常量表达式以外的其他东西的问题...

    已弃用的是将字符串文字静默转换为char*。以前没问题:

    char * hello = "hello";
    

    现在必须是:

    char const* hello = "hello";
    

    这种弃用实际上在 C++03 的附录中。

    【讨论】:

      【解决方案3】:

      让我们来分析一下你在这里做什么:

      // Create an int with value 9.
      int argc = 9;
      
      // Create an array of char* pointers of size 9
      char* argv[argc];
      
      // Assign the the first pointer to the global data string "C:\prog.exe"
      argv[0] = "c:/prog.exe";
      

      我的猜测是你并没有尝试做我上面描述的事情。试试这样的:

      // create an array of characters
      char argv[] = "C:/prog.exe";
      
      // argc in now the length of the string
      int argc = sizeof argv;
      

      -或-

      // create an array of strings
      char* argv[] = {"C:/prog.exe"};
      // argc is now the number of strings in the array
      int argc = 1;
      

      【讨论】:

        【解决方案4】:

        尝试使用const 表示字符串不会被修改。

        const char* argv[] = { "c:/prog.exe" };
        const int argc = sizeof(argv) / sizeof(argv[0]);
        
        int main()
        {
            for(int i = 0; i < argc; ++i)
            {
                ::printf("%s\n", argv[i]);
            }
        }
        

        这里,argc 也将在编译时自动计算,因此出错的可能性较小(感谢 Goz 的建议)。

        【讨论】:

        • sizeof(argv) 不会(通常)为 4 或 8,具体取决于架构(指针大小)?
        • "const int argc = sizeof(argv) / sizeof(argv[0]);"将意味着更少的错误可能性:)
        • @Mark B:是的。我脑子里放了个屁。 :-P @Goz:谢谢,我已将其添加到我的答案中。
        【解决方案5】:

        弗拉德+1。

        我对这里发生的事情的更多解释:

        您会收到“已弃用”警告,因为这样的代码:

        "asdf"
        

        现在类型为 const char*,而不是 char*。并且字符串文字可以转换为char*,以在const 不那么严格时保留与旧约定的一些兼容性。但是将字符串文字从 const char* 转换为 char* 已被弃用,您不应依赖它。

        为什么?字符串字面量是一个指向常量内存的指针,这就是为什么它需要是const char*

        【讨论】:

          【解决方案6】:

          除了其他人指出的关于 const 字符串文字被分配给非 const char 指针以及在 main() 的参数列表之外声明 argv 和 argc 的怪异之外,这里的这一行还有一个问题:

          char* argv[argc];

          在 C++ 中,您只能对数组大小使用整数常量表达式;一个整数常量表达式,它是程序源代码中的一个字面整数(如“5”或“10”),一个枚举值(如“enum colors {red, green, blue};”中的“red”),一个 sizeof表达式,或用 const 声明的 int 变量:

          // can hold 30 ints
          int myarray1[30];
          
          // can hold as many ints as myarray1 is wide in bytes
          int myarray2[sizeof(myarray1)];
          
          // C++ does not support variable-length arrays like C99 does, so if an int
          // variable is used to specify array size, it must be marked const:
          const int myarray3_size = 42;
          int myarray3[myarray3];
          

          许多 C++ 编译器都实现了 C99 风格的可变长度数组,因此在使用它们时您可能不会收到任何抱怨,但如果您想编写可移植代码,最好还是避免使用它们。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-10-16
            • 2019-07-19
            • 1970-01-01
            • 1970-01-01
            • 2012-03-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多