在以下示例中:
class A
{
public:
int len();
void setLen(int len) { len_ = len; } // warning at this line
private:
int len_;
};
Run Code Online (Sandbox Code Playgroud)
gcc with -Wshadow发出警告:
main.cpp:4: warning: declaration of `len' shadows a member of `this'
Run Code Online (Sandbox Code Playgroud)
函数len和整数len是不同类型的.为什么警告?
更新
我看到"阴影"的含义是广泛的.从形式上看,编译器也完全符合它的含义.
不过恕我直言,这面旗帜并不实用.例如常用的setter/getter成语:
class A {
void prop(int prop); // setter
int prop() const; // getter
int prop;
};
Run Code Online (Sandbox Code Playgroud)
如果有一个警告标志不会在这种情况下发出警告会很好,但会在"int a"隐藏"int a"的情况下发出警告.
添加-Wshadow对我的遗留代码发出大量警告,同时我不时发现由"阴影"问题引起的错误.
我不介意它会被称为"-Wmuch_more_practical_and_interesting_shadow"或"-Wfoooooo".
那么,是否有其他 gcc警告标志符合我的描述?
更新2
不仅我认为-Wshadow不知何故没有用的链接文本.我并不孤单:)不太严格的检查可能会更有用.
有人在几年前向我展示了以下命令将变量归零.
xor i,i
Run Code Online (Sandbox Code Playgroud)
他告诉我,这比为它分配零要快.这是真的吗?编译器是否进行优化以使代码执行此类操作?
我正在开始一些文字处理项目,我需要NumPy和NLTK.这是我第一次了解easy_install以及如何将新的python模块编译到系统中.
我有Python 2.7 x64加VS 11和VS 12.还有Cygwin(我猜的最新版本).我可以在使用VS编译的文件中看到它使用与编译python代码的版本相同的版本查找VS env,为什么?当我硬编码11.0这是我的版本时,numpy无法建立几个奇怪的错误vcvarsall(它发现vcvarsall,可能误用了它).
我不能在Windows上构建python二进制文件吗?如果没有,我可以在Linux for Windows上交叉编译吗?(使用与Google相同的Android SDK方法)
我有这样的根目录:
??? classes
??? src
??? vehicles
??? Bicycle.java
??? BicycleMain.java
Run Code Online (Sandbox Code Playgroud)
Bicycle.java
package vehicles;
public class Bicycle {
public int cadence;
public int gear;
public int speed;
public Bicycle(int startCadence, int startSpeed, int startGear) {
gear = startGear;
cadence = startCadence;
speed = startSpeed;
}
public void setCadence(int newValue) {
cadence = newValue;
}
public void setGear(int newValue) {
gear = newValue;
}
public void setSpeed(int newValue) {
speed = newValue;
}
public int getGear() {
return gear;
}
public …Run Code Online (Sandbox Code Playgroud) 我想编译以下文件(temp.cpp):
#include <iostream>
class Foo {
public:
Foo() = default;
};
int main(){
std::cout << "Works!" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用以下命令: clang++ temp.cpp -o temp -std=c++11 -Weverything -Werror
有一个错误:
temp.cpp:5:11:错误:默认函数定义与C++ 98不兼容[-Werror,-Wc ++ 98-compat]
我知道有一个类似c ++ 98-compat的警告,它是一切的一部分.如何启用除c ++ 98-compat之外的所有警告?-Weverything是否有c ++ 11兼容标志?
我能够在编译之前自动执行任务:
compile in Compile <<= (compile in Compile).dependsOn(myTask)
Run Code Online (Sandbox Code Playgroud)
如何在编译后做同样的事情?
我知道我能做到:
compile in Compile <<= (compile in Compile) map{x=>
// post-compile work
doFoo()
x
}
Run Code Online (Sandbox Code Playgroud)
执行任意Scala代码,但我需要在编译事件发生时自动执行目标任务
做类似的事情:
val foo = TaskKey[Unit]("foo", "...")
val fooTask = foo <<= scalaInstance map {si =>
...
} dependsOn(compile in Compile)
Run Code Online (Sandbox Code Playgroud)
如果我从sbt>提示符输入"foo",则可以正常工作; 即任务在编译后执行,但目标是挂钩到编译任务本身,因此无论何时编译发生,foo任务在编译完成后自动调用.
这是可能的,还是我以错误的方式处理内置编译任务?
在Ubuntu 13.04上构建thrift 0.9.1(支持C,C++,java,C#,perl,python)我收到此错误.
./configure运行没有任何选项,运行没有任何选项...
Making all in test
make[2]: Entering directory `/home/dvb/sw/thrift-0.9.1/test'
Making all in nodejs
make[3]: Entering directory `/home/dvb/sw/thrift-0.9.1/test/nodejs'
make[3]: Nothing to be done for `all'.
make[3]: Leaving directory `/home/dvb/sw/thrift-0.9.1/test/nodejs'
Making all in cpp
make[3]: Entering directory `/home/dvb/sw/thrift-0.9.1/test/cpp'
Makefile:832: warning: overriding commands for target `gen-cpp/ThriftTest.cpp'
Makefile:829: warning: ignoring old commands for target `gen-cpp/ThriftTest.cpp'
/bin/bash ../../libtool --tag=CXX --mode=link g++ -Wall -g -O2 -L/usr/lib -o libtestgencpp.la ThriftTest_constants.lo ThriftTest_types.lo ../../lib/cpp/libthrift.la -lssl -lcrypto -lrt -lpthread
libtool: link: ar cru .libs/libtestgencpp.a .libs/ThriftTest_constants.o .libs/ThriftTest_types.o
ar: …Run Code Online (Sandbox Code Playgroud) 我有条件声明声称'表达太复杂,无法在合理的时间内解决.如果我的条件中包含大约5个包含语句,则它将失败并显示该错误.这似乎不应该在编译时发生,因为声明并不是那么复杂.这是其他人遇到过的错误吗?除了分裂我的条件之外,还有其他解决方案吗?
else if(
contains(JSONDict.keys.array, "id") &&
contains(JSONDict.keys.array, "part_number") &&
contains(JSONDict.keys.array, "sales_part_number") &&
contains(JSONDict.keys.array, "include_in_search") &&
contains(JSONDict.keys.array, "description") &&
contains(JSONDict.keys.array, "brand") &&
contains(JSONDict.keys.array, "product_group") &&
contains(JSONDict.keys.array, "product_design") &&
contains(JSONDict.keys.array, "material") &&
contains(JSONDict.keys.array, "line") &&
contains(JSONDict.keys.array, "unit_of_mass") &&
contains(JSONDict.keys.array, "coating") &&
contains(JSONDict.keys.array, "pcs_converstion") &&
contains(JSONDict.keys.array, "appRim") &&
contains(JSONDict.keys.array, "appSegment") &&
contains(JSONDict.keys.array, "series") &&
contains(JSONDict.keys.array, "product_application")
){
}
Run Code Online (Sandbox Code Playgroud) 在构建Go程序以供发布时,标准做法是在go build没有任何其他选项的情况下使用吗?我问,因为go build默认情况下包含使用所有调试信息的构建.要删除它,您可以将选项传递给链接器,因此:
go build -ldflags "-w" prog.go
Run Code Online (Sandbox Code Playgroud)
这省略了所有调试符号.在构建发布程序时,您是删除此信息还是保留原样?
编辑:为了清楚起见,我想知道人们如何编译Go程序以部署到实时环境.在其他编译语言中,您有一组不同的编译器命令行选项用于调试和发布版本,发布版本通常会优化可执行文件并删除调试信息.
所以我很困惑这是如何工作的.鉴于:
template <typename T>
int foo(T t) { t.foo(); }
Run Code Online (Sandbox Code Playgroud)
似乎这个调用应该失败:
decltype(foo(int{ 13 })) fail = 42;
cout << fail << endl;
Run Code Online (Sandbox Code Playgroud)
相反它只是打印:
42
它以我可访问的所有编译器的方式工作.这是正确的行为吗?我请求C++标准的引用.