在C++中使用C头时,避免全局变量/方法名称冲突

ezp*_*zpz 2 c++ namespaces

我最近花了一些时间追逐一个恼人的小虫子,我正在为那些遇到过同样问题或者知道避免它的最佳方法的人寻找建议.

我有一种情况,我正在使用C++开发并使用strerror,因此我使用类似的东西

extern "C" {
#include <string.h>
}
Run Code Online (Sandbox Code Playgroud)

(同样的情况#include <cstring>,顺便说一下).现在,在该文件中定义了一个函数,如下所示:extern char *index (__const char *__s, int __c)这个函数带来了我最初有一个类似于以下构造的乐趣:

for (int index = 0; index != condition (); ++index) {
   // do something with buffer[index] here
}

log->write ("Final value of index: %d\n", index); // <- Ooops!!!
Run Code Online (Sandbox Code Playgroud)

但是没有得到编译错误,我得到了虚假的输出.我的编译器(g ++)标志设置得相当高,以下内容没有捕到这个:

-W -Wall -Wextra -Werror -Wshadow -Wformat -pedantic -ansi

我也不能使用#undef像这样的技巧,<cstring>因为这不是一个宏.

我的问题是其他人是否遇到过同样的问题,最好的解决办法是什么?理想情况下,我很想听听一些模糊的g ++功能,比如-use-the-force-luke=...;)

请注意,我不问如何解决这一确切的问题; 我只能更改变量名称.我正在寻找有关如何避免将来出现这种情况的提示.

编辑:

由于James Curran的回复,我想我应该澄清一下.我不是在看为什么不应该这样.据我所知,在没有局部变量的情况下,范围空间得以扩展.我感到惊讶的是,有没有标志,我可以设置警告说这件事.我倒是觉得-Wshadow,因为它捕获变量/方法的类范围内的阴影会抓住它,但我离题.

我感兴趣的是一种通知本地名称与非本地范围冲突的方法.有人提到,如果我使用流操作而不是可变参数调用,我会抓住这个特定的错误.确实如此,但即使以下情况也不会产生警告/错误g++ (GCC) 4.1.1 20070105 (Red Hat 4.1.1-51)以及以下标志-W -Wall -Wextra -Werror -Wshadow -ansi -pedantic.

#include <iostream>
#include <cstring>

int main () {
        int index = 42;
        std::cerr << index << std::endl;
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

这对我很好奇.

CB *_*ley 7

首先,看起来您正在使用printf样式的可变参数列表,这会导致类型安全性立即丢失.您应该在C++中避免这种设计.

如果你必须这样做,那么你可以考虑装饰功能的声明,告诉GCC,这是一个类似printf函数,然后它会给你警告,如果因为它为标准的参数列表不匹配格式字符串*printf功能.

例如

void write(const char* f, ...) __attribute__((format (printf, 2, 3)));
Run Code Online (Sandbox Code Playgroud)

  • 有关GCC属性语法的更多信息,请参阅http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html. (2认同)