非常简单的编译在Solaris 10上失败
Very Simple Compile failing on Solaris 10
我使用的是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.
- 为什么在声明变量时调用myFunc()是错误的?
- 是因为它不在任何功能内吗?
- 如何绕过它?
供参考,我正在写一个字符串模糊,通过行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。你正在声明全局变量,这"通常"不是一个好主意
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 从父数组测试用例构造二叉树失败
- LibGit2 SSH身份验证失败
- 如何让LLDB在成功时退出,在失败时等待
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- 宏在GCC工作,但在Solaris编译器失败
- 非常简单的编译在Solaris 10上失败
- Erlang/OTP/配置失败Open Solaris