有没有办法部分预处理C或C++源文件?通过"部分预处理",我的意思是扩展一些但不是全部的#include指令.例如,我想扩展#includes指向我的项目标题,但不是#includes指向其他库的标题.
我尝试通过gcc -E仅运行-I我的项目标题的-I标志而不是库的标志来执行此操作,但这不起作用,因为gcc在遇到#include时无法展开时发出错误.
编辑:我并不关心预处理器在宏扩展方面的行为.
如果我有一个带有数组成员的结构,并且我在结构的构造函数中显式调用了数组的默认构造函数,那么元素是否会默认构造?(在整数数组的情况下,这将意味着零初始化).
struct S
{
S() : array() {}
int array[SIZE];
};
...
S s;
// is s.array zero-initialized?
Run Code Online (Sandbox Code Playgroud)
使用gcc进行的快速测试表明情况确实如此,但我想确认我可以依赖这种行为.
(我注意到如果我没有在结构构造函数中显式地默认构造数组,则数组元素具有随机值.)
我将函数模板特化的地址传递给常规模板函数没有问题:
template <typename T>
void f(T) {}
template <typename A, typename B>
void foo(A, B) {}
int main()
{
foo(&f<int>, &f<float>);
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试将相同的特化传递给可变参数模板时:
template <typename T>
void f(T) {}
template <typename... A>
void bar(A...) {}
int main()
{
bar(&f<int>, &f<float>);
}
Run Code Online (Sandbox Code Playgroud)
我用GCC得到了以下编译器错误(我试过4.6.1和4.7.0):
test.cpp: In function 'int main()':
test.cpp:9:27: error: no matching function for call to 'bar(<unresolved overloaded function type>, <unresolved overloaded function type>)'
test.cpp:9:27: note: candidate is:
test.cpp:5:6: note: template<class ... A> void bar(A ...)
test.cpp:5:6: note: template argument deduction/substitution …Run Code Online (Sandbox Code Playgroud) 我想在基于Java的IDE的插件中使用clang的代码分析功能.
由于插件必须用Java编写,我想知道是否有任何用于libclang的Java绑定,或者是否有其他方式从Java程序访问clang功能(除了直接使用JNI)?
这个问题涵盖了C++模板代码中何时以及为何需要使用typename和template消除歧义.
在C++ 03中不需要使用这些消歧器是否有效?在C++ 11中怎么样?
我正在尝试加载使用SWIG创建的PHP扩展,但是在启动PHP时出现以下错误:
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php5/20090626/libtg.so' - /usr/lib/php5/20090626/libtg.so: undefined symbol: __gxx_personality_v0 in Unknown on line 0
Run Code Online (Sandbox Code Playgroud)
我试图加载的扩展名是命名的libtg.so,并使用以下命令编译:
g++ -shared libtg_wrap.o -o libtg.so
Run Code Online (Sandbox Code Playgroud)
其中libtg_wrap.o是SWIG生成的包装器代码的目标文件.
__gxx_personality_v0可以找到缺少的符号libstdc++.so,如以下命令所示:
$ nm -D /usr/lib/libstdc++.so.6 | grep __gxx_personality_v0
00000000000b9990 T __gxx_personality_v0
Run Code Online (Sandbox Code Playgroud)
libstdc++.solibtg.so在以下命令中可以参考:
$ ldd libtg.so
linux-vdso.so.1 => (0x00007fff5f932000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f3fc937c000)
libm.so.6 => /lib/libm.so.6 (0x00007f3fc90f9000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f3fc8ee2000)
libc.so.6 => /lib/libc.so.6 (0x00007f3fc8b5f000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3fc98fc000)
Run Code Online (Sandbox Code Playgroud)
所以我不明白为什么它找不到符号.关于如何进一步调试这个的任何想法?
以下代码使用gcc和clang编译好.
template <typename T>
struct identity
{
typedef T type;
};
template <typename T>
void foo(typename identity<T>::type);
template <typename T>
void foo(T);
int main()
{
foo<int>(0);
}
Run Code Online (Sandbox Code Playgroud)
看起来重载决策是选择第一个重载(identity<T>::type一个).
有人可以解释为什么重载不是模棱两可的吗?据我所知,它们之间唯一的区别是第一个的参数是非推导的上下文而第二个的参数不是,但是因为我明确地提供了模板参数,所以我不赞成不明白为什么这很重要.
我一直在使用Mercurial遇到以下问题,这非常烦人:
hg update B.Mercurial"帮助"尝试将我的本地更改重新设置为应用于B之上.这通常会导致冲突,现在它要求我修复冲突.但是,我不想修复冲突!我不希望我的本地更改完全适用于B之上.我希望他们留在A,或者作为A之后的新提交,或者根据具体情况修改为A.
有没有办法可以从这个州恢复?我知道的唯一方法是
这是很多工作,而且毫无意义.我不应该将我的本地更改重新设置为在B之上应用,只是再次将它们重新绑定以应用于A之上.
如果没有更好的办法,从这个错误中恢复过来,是有办法让hg拒绝时,你有局部变化做一个更新?我从来不想这样做 - 如果我想要我只是提交本地更改并在B之上重新定义它们.
以下简单的程序段错误:
#include <string.h>
int main()
{
void* voidp = NULL;
char zeroes[sizeof(void*)];
memset(zeroes, 0, sizeof(void*));
int res = memcmp(&voidp, zeroes, sizeof(void*));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
调试器显示段错误在memcmp中.
我的机器运行64位Ubuntu 8.04,gcc版本是4.2.4.
它在我尝试过的其他机器上运行正常(32位或64位).
关于发生了什么的任何想法?
更新:这是汇编代码:
.file "failed.c"
.text
.globl main
.type main, @function
main:
.LFB2:
pushq %rbp
.LCFI0:
movq %rsp, %rbp
.LCFI1:
subq $32, %rsp
.LCFI2:
movq %fs:40, %rax
movq %rax, -8(%rbp)
xorl %eax, %eax
movq $0, -32(%rbp)
leaq -16(%rbp), %rdi
movl $8, %edx
movl $0, %esi
call memset
leaq -16(%rbp), %rsi
leaq -32(%rbp), %rdi …Run Code Online (Sandbox Code Playgroud) 如果我想从模板派生类中使用模板基类的成员,我必须将其带入范围:
template <typename T>
struct base
{
void foo();
};
template <typename T>
struct derived : base<T>
{
using base<T>::foo;
};
Run Code Online (Sandbox Code Playgroud)
为什么我不能将此using语句放入本地范围,就像其他using语句一样?
template <typename T>
struct base
{
void foo();
};
template <typename T>
struct derived : base<T>
{
void f()
{
using base<T>::foo; // ERROR: base<T> is not a namespace
}
};
Run Code Online (Sandbox Code Playgroud)