Tag: 名称空间

C ++:extern“C”和类成员之间的命名空间冲突

我偶然发现了一个相当奇特的c ++命名空间问题: 浓缩的例子: extern “C” { void solve(lprec * lp); } class A { public: lprec * lp; void solve(int foo); } void A::solve(int foo) { solve(lp); } 我想在我的C ++成员函数A :: solve中调用c函数solve。 编译器对我的意图不满意: error C2664: ‘lp_solve_ilp::solve’ : cannot convert parameter 1 from ‘lprec *’ to ‘int’ 有什么我可以在解决function的前缀? C :: solve不起作用

使用cmath 时禁用math.h废话

之前我遇到了一个问题,因为函数在没有std::情况下被重载。 诅咒仍然时不时发生,因为我不使用using namespace std; 。 删除使用命名空间std会导致程序获得废话结果 有没有办法禁用所有来自c的非std函数,只能在命名空间std下使用c ++函数(不必using namespace std; )? 换句话说:如果我使用sin()而不是std::sin() ,我想得到一个错误,这样我就不会犯这个错误。 当然,不仅是罪,而且是与math.h发生冲突的每一个function。

在C源文件中包含带有命名空间的C ++头文件会导致编译错误

我不是一个专业的C ++程序员,我最近在C ++中做了一个技巧,这引起了我下面的问题。 我的任务目标:复制特定的非系统线程(实际上是协作线程)安全模块,以创建系统线程安全版本,以支持系统中的不同需求。 但是我们决定创建一个名称空间来保护C ++头文件中的系统线程版本,而不是创建sys_XXX函数来保持兼容性。 我实际上可以将它包含在CPP文件中并愉快地工作但我刚刚意识到我的funcInit调用在它到达CPP文件控件之前没有被调用。 不幸的是,协作线程版本的这个init是在C文件中。 现在我需要从同一个地方初始化我的系统线程安全版本,但我已被编译错误阻止,这是我所知道的难以解决的。 编译错误日志: – In file included from sysinit.c:87: sys_unicode.h:39: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘SystemThreadUtils’ <== corresponds to line [namespace SystemThreadUtils {] sysinit.c:88: sysinit.c:512: error: expected identifier or '(' before string constant <== corresponds to line [extern "C" bool SystemThreadUtils::funcInit(void);] sysinit.c:513: error: expected […]

C ++命名空间内的extern“C”链接?

namespace someNameSpace { extern “C” void doSomething() { someOperations(); } } 我想在C ++和C环境中运行doSomething() 。 如果我将它暴露给extern “C”链接, someNameSpace是否还在封装doSomething() ? 有没有一种很好的方法在C ++和C之间共享函数,同时避免在C ++端污染全局命名空间? 编辑 :因为此代码主要用于C ++模式,而C链接仅供测试使用,我想这是一种更好的方法。 namespace someNameSpace { #ifdef COMPILE_FOR_C_LINKAGE extern “C” #else extern “C++” #endif { void doSomething() { someOperations(); } } }

在标题中声明的C函数是否保证在全局名称空间和std中?

所以这是我一直想知道但却从未确定过的事情。 所以这完全是好奇心问题,而不是真正的问题。 据我所知,当你做#include 事情时,所有东西(当然除了宏)都在std:: namespace中声明。 我见过的每个实现都是通过执行以下操作来实现的: #include namespace std { using ::abort; // etc…. } 这当然会影响全局命名空间和std的事物。 这种行为有保障吗? 或者实现是否可能将这些内容放在std但不在全局命名空间中? 我能想到的唯一方法就是让你的libstdc ++实现每个c函数本身直接将它们放在std ,而不是只包含现有的libc头文件(因为没有从命名空间中删除某些东西的机制)。 这当然是很多努力,几乎没有任何好处。 我的问题的实质是,以下程序是否严格符合并保证有效? #include int main() { ::printf(“hello world\n”); } 编辑:我发现的最接近的是这个(17.4.1.2p4): 除第18条至第27条所述外,每个标题cname的内容应与ISO / IEC 9899:1990编程语言C(第7条)或ISO / IEC中规定的相应标题名称h的内容相同。 :1990编程语言-C修正案1:C完整性,(第7条),酌情包括在内。 但是,在C ++标准库中,声明和定义(在C中定义为宏的名称除外)都在命名空间std的命名空间范围(3.3.5)内。 说实话,我可以解释任何一种方式。 “每个标题cname的内容应与相应标题name.h的内容相同,如ISO / IEC 9899:1990编程语言C中所规定的那样”告诉我它们可能在全局命名空间中是必需的,但是“在但是,C ++标准库,声明和定义(在C中定义为宏的名称除外)都在命名空间std的命名空间范围(3.3.5)内。 说他们在std(但没有指明他们所在的任何其他范围)。

理解C命名空间

引自这里 , 在C中,有两种不同的类型名称空间:struct / union / enum标记名称的名称空间和typedef名称的名称空间。 name.c $ cat name.c #include typedef long long long2; int long2 () { return 4; } int main() { printf(“hello, world!”); return 0; } $ gcc name.c -o name name.c:4: error: ‘long2’ redeclared as different kind of symbol name.c:3: error: previous declaration of ‘long2’ was here $ name2.c […]