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

标签 c++ namespaces

我最近花了一些时间来追踪一个烦人的小错误,我正在为那些遇到同样问题或知道避免它的最佳方法的人寻找建议。

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

extern "C" {
#include <string.h>
}

(#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!!!

但我得到的不是编译错误,而是伪造的输出。我的编译器 (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;
}

这对我来说很好奇。

最佳答案

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

如果你必须这样做,那么你可以考虑修饰函数声明以告诉 gcc 它是一个类似 printf 的函数,然后如果你的参数列表与你的格式字符串不匹配它会给你警告对于标准的 *printf 函数。

例如

void write(const char* f, ...) __attribute__((format (printf, 2, 3)));

关于c++ - 在 C++ 中使用 C 头文件时避免全局变量/方法名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3197292/

相关文章:

c++ - 什么是 diff b/w Includes in VC++ Directories options 和 Additional include directories in C++ -> General in Visual Studio

c++ - C++中的for循环提前一步使用双重突破,未达到边界值

c++ - 使用 SelectObject 时从 void* 的转换无效

c++ - 隐藏 3rd 方 namespace 危险吗?

postgresql - Docker用户命名空间将容器中的用户映射到主机

C++ 重载运算符>>(输入)不改变原来的

c++ - QTCreator g++.exe : fatal error: no input files (Windows)

asp.net-mvc - 我怎样才能在 asp.net mvc 中做一个消息框?

qt - 为 Qt 注册自定义类型时,何时、何地以及为何使用命名空间

asp.net-mvc-2 - ASP.NET MVC - 嵌套应用程序中的 Controller 名称