相关疑难解决方法(0)

什么是C++ 11中的lambda表达式?

什么是C++ 11中的lambda表达式?我什么时候用?他们解决了哪些问题在引入之前是不可能的?

一些示例和用例将是有用的.

c++ lambda c++-faq c++11

1408
推荐指数
7
解决办法
45万
查看次数

int main(){}(没有"void")在ISO C中是否有效且可移植?

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 之间的区别.)

c c99 language-lawyer c11

22
推荐指数
3
解决办法
1133
查看次数

为什么允许声明一个大小取决于用户输入的自动数组?

我正在使用MinGW来编译C++ 11,我发现这不会引发错误:

int S;
cin>>S;
char array[S];
Run Code Online (Sandbox Code Playgroud)

虽然这样做("'数组'的存储大小未知"):

char array[];
Run Code Online (Sandbox Code Playgroud)

对我来说,第一种情况下的大小也是未知的,因为它取决于用户输入的内容.

据我所知,自动数组在编译时分配在堆栈内存中.那么为什么第一个例子不会失败呢?

c++ arrays stack variable-length-array

15
推荐指数
2
解决办法
823
查看次数

我应该使用哪些编译标志来避免运行时错误

刚刚在这里学到,-Wsequence-point当代码可以调用UB时,comiplation标志会弹出警告.我在类似的声明上尝试过

int x = 1;
int y = x+ ++x;
Run Code Online (Sandbox Code Playgroud)

它工作得非常好.到目前为止,我已编译gccg++仅使用-ansi -pedantic -Wall.你有没有其他有用的标志来使代码更安全和健壮?

c c++ compiler-flags compiler-warnings sequence-points

8
推荐指数
1
解决办法
353
查看次数

`class template Example <int>;`语句对C++ 11意味着什么?

我已经参考了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行中的任何一行是模板特化还是实例化.

我还尝试在ISO发布C++ 11草案中找到相关的语法生成规则(一个允许template之后class …

c++ templates c++11

8
推荐指数
2
解决办法
587
查看次数

如何禁用GNU C扩展?

正如您在以下代码中看到的,我在以下代码中引入了嵌套函数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

我在哪里弄错了?

c gcc

7
推荐指数
1
解决办法
3364
查看次数

如何使用GNU g ++只编译标准C++?

GNU g ++编译器中有一些扩展,例如VLA(可变长度数组),即使这些功能不是C++标准.

因此,如果我只需要使用C++标准结构编译程序并避免这些额外的扩展,我可以使用GNU g ++吗?

有点像g++ test.cpp -std=onlyStandards

c++ g++

6
推荐指数
1
解决办法
242
查看次数

多平台C++项目设置和工具

我的任务是创建一个C++ SDK - 最有可能是动态库的形式.

它应该用于不同的平台 - Windows(32/64位),Linux(32/64位),Mac OS,AndroidiOS.我对多平台项目设置没有多少经验,我正在尝试决定使用哪些方法和工具进行最简单的开发和部署.

附注:我还必须在Bamboo CI服务器上准备自动构建(作业),以便为每个所需目标运行编译和测试.

我的主要困境是:

  1. 项目设置.我应该准备不同的项目模式以便在不同的平台上使用(例如Windows上的.sln和Linux上的makefile),或者尝试使用像CMake这样的工具?是否有可能准备一个适合所有这些目标平台的CMake项目?
  2. 编译工具链.我应该为每个平台使用"原生"C++编译器(如Windows上的MSVC和Linux上的GCC),还是像Clang + LLVM这样的单一工具链?Clang + LLVM(以及一些显然的链接器)是否能够为我需要的所有这些平台构建可分发的二进制文件?
  3. 发展环境.哪种OS/IDE最适合从事这类项目?我更喜欢在Windows上工作,我通常的IDE是Visual Studio - 在这种情况下是否可行,或者其他更合适的东西?

我知道我的问题非常复杂,对于这些问题没有直接的答案,但是每个建议甚至部分答案都会非常感激:)

c++ cross-platform

6
推荐指数
1
解决办法
1692
查看次数