非常简单的编译在Solaris 10上失败

Very Simple Compile failing on Solaris 10

本文关键字:失败 Solaris 简单 编译 非常      更新时间:2023-10-16

我使用的是Solaris 10。我使用的编译器是:/opt/solstudio12.2/bin/CC

编译下面的文件(myTest2.C)失败。

% CC -I. -o myTest2 myTest2.C
"myTest2.C", line 30: Error: "{" expected instead of "myFunc".
"myTest2.C", line 33: Error: "{" expected instead of "myFunc".
2 Error(s) detected.
  1. 为什么在声明变量时调用myFunc()是错误的?
  2. 是因为它不在任何功能内吗?
  3. 如何绕过它?

供参考,我正在写一个字符串模糊,通过行c++代码和替换引号字符串的实例(示例:"myString")与函数调用(示例:scrambleString("myString"))。本例中的myFunc类似于scrambleString


#include <iostream>
#include <string>

using namespace std;

char* myFunc(string inString)
{
    char outString[1024];
    int i;
    for (i = 0; i <= inString.size()-1; i++)
        outString[i] = inString[i];
    outString[i+1] = '';
    return outString;
}

// This Works:
static char myVariable1 [ ] = "MyString1" ;
// This Breaks:
static char myVariable2 [ ] = myFunc("MyString2") ; // Line #30
// This Breaks:
char myVariable5 [1024] = myFunc("MyString3"); // Line
#33


int main()
{
    // This Works:
    string Z = myFunc("Gdkkn Vnqkc");
    cout << "Z = " << Z << endl << endl;    
}

你的代码是不安全的,因为你返回堆栈内容,但除此之外,你返回一个"char *"..如果您将签名更改为:

,您的代码将编译(但仍然是不安全的,因为您返回指向堆栈内容的指针)
static char *myVariable = myFunc("foo");

话虽如此……为什么不返回一个字符串对象,而不是使用char*?

你的代码
// This Works:
static char myVariable1 [ ] = "MyString1" ;

工作是因为基于char的字面值字符串是char的数组。你用一个数组初始化一个数组

接下来的几行,

// This Breaks:
static char myVariable2 [ ] = myFunc("MyString2") ; // Line #30

不起作用,因为您正在用char*指针初始化char数组。数组必须用数组初始化。花括号符号很常见,这就是编译器抱怨它期望的,而不是函数调用。

如果你想通过函数调用初始化一些全局字符串变量,那么考虑使用std::string和/或单例函数。例如,

static std::string& myVariable2()
{
    static std::string theString = myFunc( "MyString2" );
    return theString;  // Return a reference to the string instance.
}

然而,这是一个糟糕设计的技术解决方案,所以我只推荐它作为当前问题的纯技术解决方案。

应该尽量避免使用全局变量。

干杯,hth。

1。你的功能

char* myFunc(string inString)
{
    char outString[1024];
    int i;
    for (i = 0; i <= inString.size()-1; i++)
        outString[i] = inString[i];
    outString[i+1] = '';
    return outString;
}

有一个错误:您正在返回指向局部变量的指针。函数返回后,变量outString将超出作用域。无论你是否将它声明为std::string,你都会遇到麻烦。

2。static char myVariable2 [ ] = myFunc("MyString2") ; // Line #30

这里myVariable2的大小在编译时是未知的,所以这将打破

3。char myVariable5 [1024] = myFunc("MyString3");

错误信息如下:

error: array must be initialized with a brace-enclosed initializer,

我认为在这种情况下,错误信息说明了一切。你得到"Error: "{" expected instead of "myFunc". "的错误信息只是说同样的事情的另一种方式。

4。你正在声明全局变量,这"通常"不是一个好主意