为什么以下不再是有效的C++ 11代码(编译为C++ 98):
#include <sstream>
#include <iostream>
int main()
{
std::ostringstream os;
os << "Hello World!";
std::cout << os << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里的参考是(截断)我得到的clang:
$ clang++ -stdlib=libc++ -std=c++11 t.cxx
t.cxx:8:13: error: invalid operands to binary expression ('ostream' (aka 'basic_ostream<char>') and 'std::ostringstream' (aka 'basic_ostringstream<char>'))
std::cout << os << std::endl;
~~~~~~~~~ ^ ~~
/usr/include/c++/v1/ostream:190:20: note: candidate function not viable: no known conversion from 'std::ostringstream' (aka 'basic_ostringstream<char>') to
'const void *' for 1st argument; take the address of the argument with & …Run Code Online (Sandbox Code Playgroud) 有人可以帮我理解为什么以下代码无法编译(g ++ 4.8).我的理解是可以初始化POD
#include <iostream>
#include <type_traits>
struct my_int
{
int val_;
};
struct B : public my_int
{
};
int main()
{
std::cout << std::is_pod<my_int>::value << std::endl;
std::cout << std::is_pod<B>::value << std::endl;
const my_int v = { 123 };
//const B v2 = { 123 }; // does not compile with g++ 4.8.
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译是:
g++ -std=c++11 t.cxx
t.cxx: In function 'int main()':
t.cxx:24:21: error: could not convert '{123}' from '<brace-enclosed initializer list>' to 'const B'
const …Run Code Online (Sandbox Code Playgroud) 我一直在遵循常见问题解答中的说明:是否有选项可以产生更多"详细"编译?.我现在有了:
$ cat C:/Program Files/CMake 2.8/share/cmake-2.8/Modules/Platform/Windows.cmake
[...]
# uncomment these out to debug nmake and borland makefiles
set(CMAKE_START_TEMP_FILE "")
set(CMAKE_END_TEMP_FILE "")
set(CMAKE_VERBOSE_MAKEFILE 1)
Run Code Online (Sandbox Code Playgroud)
然后我重新生成我的项目,然后运行nmake:
> cmake --version
cmake version 2.8.12.2
> cmake -G"NMake Makefiles" ..\project
> nmake VERBOSE=1
[...]
[ 73%] Building CXX object apps/foobar/CMakeFiles/bla.dir/my.cpp.obj
cd C:\Dashboards\MyTests\project-build-debug-vista32-nightly\apps\foobar
C:\PROGRA~1\MICROS~1.0\VC\bin\cl.exe @C:\Users\voxxl\AppData\Local\Temp\nm1362.tmp
Run Code Online (Sandbox Code Playgroud)
有没有办法访问完整的cl命令行?
我从一个更大的2D程序中提取了这个简单的成员函数,它所做的只是一个for循环访问三个不同的数组并进行数学运算(1D卷积).我一直在测试使用OpenMP来加快这个特定的功能:
void Image::convolve_lines()
{
const int *ptr0 = tmp_bufs[0];
const int *ptr1 = tmp_bufs[1];
const int *ptr2 = tmp_bufs[2];
const int width = Width;
#pragma omp parallel for
for ( int x = 0; x < width; ++x )
{
const int sum = 0
+ 1 * ptr0[x]
+ 2 * ptr1[x]
+ 1 * ptr2[x];
output[x] = sum;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我在debian/wheezy amd64上使用gcc 4.7,整个程序在8 CPU机器上执行速度要慢很多.如果我在debian/jessie amd64上使用gcc 4.9(在这台机器上只有4个CPU),整个程序执行的差别很小.
使用time比较:单核运行:
$ ./test black.pgm out.pgm 94.28s user 6.20s system 84% …Run Code Online (Sandbox Code Playgroud) 我正在尝试设计一个可以在 Python 中轻松扩展的 C 接口(使用ctypes)。我在 C 中使用了自然习语:
struct format {
int (*can_open)(const char *filename);
struct format * (*open)(const char *filename);
void (*delete)(struct format *self);
int (*read)(struct format *self, char *buf, size_t len);
};
Run Code Online (Sandbox Code Playgroud)
如果我想直接从 C 扩展这个接口,它工作得很好:
struct derived /* concrete implementation */
{
struct format base;
};
Run Code Online (Sandbox Code Playgroud)
但我真正想做的是使用 ctypes 从 Python 实现这个接口。这是我到目前为止所拥有的:
CANOPENFUNC = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_char_p)
#OPENFUNC = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_char_p)
#OPENFUNC = ctypes.CFUNCTYPE(ctypes.POINTER( python_format ), ctypes.c_char_p)
#DELETEFUNC = ctypes.CFUNCTYPE(None, ctypes.c_void_p)
#READFUNC = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_void_p)
def py_canopen_func( …Run Code Online (Sandbox Code Playgroud) 我正在尝试学习gcc自动矢量化模块.从这里阅读文档后.
这是我尝试过的(debian jessie amd64):
$ cat ex1.c
int a[256], b[256], c[256];
foo () {
int i;
for (i=0; i<256; i++){
a[i] = b[i] + c[i];
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我只是运行:
$ gcc -x c -Ofast -msse2 -c -ftree-vectorize -fopt-info-vec-missed ex1.c
ex1.c:5:3: note: misalign = 0 bytes of ref b[i_11]
ex1.c:5:3: note: misalign = 0 bytes of ref c[i_11]
ex1.c:5:3: note: misalign = 0 bytes of ref a[i_11]
ex1.c:5:3: note: virtual phi. skip.
ex1.c:5:3: note: num. args = 4 (not unary/binary/ternary …Run Code Online (Sandbox Code Playgroud) 如何在 GitLab CI YAML 文件中指定包含空格的字符串文字?
例如,我用来调用位于 gitlab-ci.yml 文件中的 C:\Program Files (x86)...\msbuild.exe 的 msbuild.exe,如下所示
build:
- C:\Program Files (x86)\...\msbuild.exe MySolution.sln
Run Code Online (Sandbox Code Playgroud)
我尝试使用单引号和双引号来封装路径,但失败了。
有任何想法吗?谢谢
我真的很喜欢拥有我的顶级项目,推动我的子项目的编译。我目前有一棵树,例如:
gdcm -- cmake_minimum_required(VERSION 3.8.2 FATAL_ERROR)
??? Utilities
? ??? gdcmcharls -- cmake_minimum_required(VERSION 2.8.7)
Run Code Online (Sandbox Code Playgroud)
我想让它尽可能接近我有一个方便的副本的每个不同的上游项目。但是,当我想测试 CMake 的新功能时,我不能简单地更改顶级 CMakeList.txt 文件并希望将新策略传输到单个子项目(根据嵌套命令的定义cmake_minimum_required)。
有没有成语可以这样说:
if(TOPLEVEL PROJECT)
cmake_minimum_required(VERSION 2.8.7)
else()
cmake_minimum_required(VERSION ${INHERITED_VERSION})
endif()
Run Code Online (Sandbox Code Playgroud) 我试图理解表格:
让我们考虑第一个属性:
入藏号 (0008,0050)
我看到此 DICOM 属性从未在任何选项中列出(例如'Clean Desc. Opt.')。这意味着声称符合应用程序级别机密性配置文件和选项作为去标识符的应用程序需要应用'Z'操作代码(就像'C'在不可见列中存在隐式默认操作代码一样):
替换为零长度值,或可能是虚拟值且与 VR 一致的非零长度值
现在,如果我们移动到表中的第二个属性:
收购评论 (0018,4000)
我们看到该属性列在一个且只有一个'Clean Desc. Opt.'带有操作代码的选项中'C'(没有列出带有显式'K'操作代码的选项)。问题是为什么?如果我们假设总是有一个隐含的默认'C'操作代码,为什么标准会在特定列中明确列出它?
根据我的理解,当 'Clean Desc. 选择。' 使用时,会发生以下行为:
'Z'用于登录号 (0008,0050)'X'用于收购评论 (0018,4000)(显式'C'操作)当'清洁描述。选择。' 在不使用时,下列行为发生:
'Z'用于登录号 (0008,0050)'X'用于收购评论(0018,4000)(无明确'C'行动)给定以下通用Foo1函数:
struct Key<T> {}
static readonly Key<double> MyKey = new Key<double>();
T? Foo1<T>(Key<T> key)
{
return default;
}
Run Code Online (Sandbox Code Playgroud)
天真的读者会认为:
var foo1 = Foo1(MyKey);
Run Code Online (Sandbox Code Playgroud)
foo1类型为double?,结果表明编译器正在选择double返回类型。我需要显式添加一个约束来获取可为空的返回值:
T? Foo2<T>(Key<T> key) where T : struct // really return a nullable
{
return default;
}
Run Code Online (Sandbox Code Playgroud)
?有人可以解释为什么我的第一个函数中没有选择可空引用的注释吗Foo1?