如何让GCC警告标识符名称冲突?

时间:2014-01-30 09:29:32

标签: c++ gcc namespaces g++ warnings

这是一个最小的例子:

#include <algorithm>
#include <vector>
using namespace std;

vector<int> count;

int main() {
    int(count.size());
    return 0;
}

使用

进行编译
$ \g++ --std=c++0x -ggdb -D_GLIBCXX_DEBUG -W -pipe \
       -mmmx -msse -msse2 -msse3 \
       -ftrapv -Wall -Wextra \
       -Wctor-dtor-privacy  -Wlogical-op    -Wnoexcept \
       -Woverloaded-virtual     -Wsign-promo    -Wstrict-null-sentinel \
       -Wstrict-overflow=5      -Wundef     -Weffc++   \
       -Wcast-align \
       -Wcast-qual      -Wchar-subscripts   -Wcomment \
       -Wconversion \
       -Wdisabled-optimization  -Wfloat-equal   \
       -Wformat  \
       -Wformat=2   -Wformat-nonliteral     -Wformat-security  \
       -Wformat-y2k     -Wimport    -Winit-self     -Winline \
       -Winvalid-pch    -Wunsafe-loop-optimizations  \
       -Wmissing-braces -Wmissing-field-initializers \
       -Wmissing-format-attribute       -Wmissing-include-dirs \
       -Wmissing-noreturn   -Wpacked    -Wpadded \
       -Wpointer-arith \
       -Wredundant-decls    -Wreturn-type   -Wsequence-point  \
       -Wshadow \
       -Wsign-compare   -Wstack-protector   \
       -Wstrict-aliasing \
       -Wstrict-aliasing=2  -Wswitch    -Wswitch-default \
       -Wswitch-enum        -Wtrigraphs     -Wuninitialized \
       -Wunknown-pragmas    -Wunreachable-code   \
       -Wvolatile-register-var  -Wwrite-strings -Wunused-parameter  \
       -Wno-parentheses d.cpp

即。我从其他问题得到的大多数警告标志,我得到:

d.cpp: In function 'int main()':
d.cpp:7:5: error: expected primary-expression before 'int'
     int(count.size());
     ^
d.cpp:7:5: error: expected ';' before 'int'

Status 1

显然,由于在count中声明了<algorithm>,因此感到困惑。但错误消息并未显示出来。

如果有一个警告说向量与函数同名,那就没关系了。 有这样的警告吗?

删除using namespace std;可以避免此问题,但是在using namespace std;出现时是否仍然有效警告?它所要做的就是跟踪当前上下文中的符号,编译器已经执行了这些符号,并在语句隐藏或重新声明时发出警告。看起来像一个简单的功能,我无法相信它已经不会这样做。

1 个答案:

答案 0 :(得分:2)

  

显然,它被混淆了,因为计数是在。但错误消息并未显示出来。

使用gcc之外的其他内容,您会看到更好的错误消息。来自gcc的错误消息有所改善,但这并没有多说。来自gcc的错误消息因缺乏清晰度而臭名昭着。在这方面,来自clang的信息更加清晰。它讲述了两个无法区分的候选者,一个是count.size(),其中“count”是您声明的向量,另一个是std::count.size(),其中std::count在标题中定义<algorithm>

这个特定问题的解决方案很简单:摆脱using namespace std语句,摆脱无关的#include指令。键入std::vector<int>而不是vector<int>,几乎没有任何成本。当代码需要被其他人理解和维护时,输入额外的五个字符可以节省大量下游时间。当你不再理解你的代码所做的事情时,那个“别人”可能就是你从现在开始的六个月。