什么是C++ 11中的lambda表达式?我什么时候用?他们解决了哪些问题在引入之前是不可能的?
一些示例和用例将是有用的.
C标准main为托管实现指定了两种形式的定义:
int main(void) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
和
int main(int argc, char *argv[]) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
它可以以与上述"等效"的方式定义(例如,您可以更改参数名称,替换int为定义为int或写char *argv[]为的typedef名称char **argv).
它也可以"以某种其他实现定义的方式"定义 - 这意味着如果实现记录它们,那么它们int main(int argc, char *argv[],
char *envp)是有效的.
"以其他一些实施方式定义的方式"条款不在1989/1990标准中; 它是由1999标准添加的(但早期标准允许扩展,因此实现仍然允许其他形式).
我的问题是:鉴于当前(2011)ISO C标准,是表格的定义
int main() { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
所有托管实现都有效且可移植?
(请注意,我没有解决C++中的任何一个void main或没有使用
int main()括号的问题.这只是ISO int main(void)和int main()ISO 之间的区别.)
我正在使用MinGW来编译C++ 11,我发现这不会引发错误:
int S;
cin>>S;
char array[S];
Run Code Online (Sandbox Code Playgroud)
虽然这样做("'数组'的存储大小未知"):
char array[];
Run Code Online (Sandbox Code Playgroud)
对我来说,第一种情况下的大小也是未知的,因为它取决于用户输入的内容.
据我所知,自动数组在编译时分配在堆栈内存中.那么为什么第一个例子不会失败呢?
刚刚在这里学到,-Wsequence-point当代码可以调用UB时,comiplation标志会弹出警告.我在类似的声明上尝试过
int x = 1;
int y = x+ ++x;
Run Code Online (Sandbox Code Playgroud)
它工作得非常好.到目前为止,我已编译gcc或g++仅使用-ansi -pedantic -Wall.你有没有其他有用的标志来使代码更安全和健壮?
我已经参考了cplusplus.com上的Explicit Template Instantiation文章,该文章给出了以下示例:
template <typename T> class Example
{
public:
Example( T test )
{
_data = test;
}
void setTest(T test)
{
_data = T;
}
private:
T _data;
};
class template Example<int>;
class template Example<float>;
class template Example<double>;
Run Code Online (Sandbox Code Playgroud)
除了我试图将一个类型分配给成员变量_data = T而不是我认为应该是什么之类的东西看起来像是一个遗漏错误_data = test- 我不明白的是最后3行声明或指示的是什么编译器要做什么?
我知道模板是什么,用它们构建程序,并且一般都知道它们的实例化和专业化.我对后两者的理解可能有一些漏洞,但我通常使用例如template class Example<int>;表单而不是片段中显示的那个来指示显式模板实例化.
我已经尝试使用编译片段g++ -std=c++11 -pedantic,它编译得很好而没有警告(我先纠正了_date = T上面的错误).
在我对一个相关问题的答案进行评论之后,我仍然不确定该片段中最后3行中的任何一行是模板特化还是实例化.
正如您在以下代码中看到的,我在以下代码中引入了嵌套函数main():
#include <stdio.h>
int main(){
int a=5;
printf("%d\n",a);
{
int a=10;
printf("%d\n",a);
}
printf("%d\n",a);
//Nested function
int main(int a){
if(a>0)printf("%d\n",a--);
return 0;
}
main(7);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,我使用-std=c99gcc中的标志来"禁用"不必要的扩展,但我没有得到任何错误.
gcc temp3.c -std=c99 -o temp3.out
我在哪里弄错了?
GNU g ++编译器中有一些扩展,例如VLA(可变长度数组),即使这些功能不是C++标准.
因此,如果我只需要使用C++标准结构编译程序并避免这些额外的扩展,我可以使用GNU g ++吗?
有点像g++ test.cpp -std=onlyStandards?
我的任务是创建一个C++ SDK - 最有可能是动态库的形式.
它应该用于不同的平台 - Windows(32/64位),Linux(32/64位),Mac OS,Android和iOS.我对多平台项目设置没有多少经验,我正在尝试决定使用哪些方法和工具进行最简单的开发和部署.
附注:我还必须在Bamboo CI服务器上准备自动构建(作业),以便为每个所需目标运行编译和测试.
我的主要困境是:
我知道我的问题非常复杂,对于这些问题没有直接的答案,但是每个建议甚至部分答案都会非常感激:)