C / C ++ #define宏内宏?

我想要像:

#define C_OR_CPP(C__, CPP__) #ifdef __cplusplus\ CPP__\ #else\ C__\ #endif 

可能吗? 也许#include有些肮脏的黑客?

原因:我创建了一个头部,其中一个结构使用了一个类型为vector*的成员变量,但是在C中我希望​​它只是void* ,你知道。

TIA

有什么问题

 #ifdef __cplusplus #define C_OR_CPP(C, CPP) CPP #else #define C_OR_CPP(C, CPP) C #endif 

(将双下划线的名称留给每个phresnel备注的实现)

不是在C ++中。 但是你可以

 #ifdef __cplusplus # define CPP #else # define C #endif 

我认为这只是你的一个病态例子。 另请注意,双重下划线保留给库实现者(请参见17.6.4.3.2全局名称)。

矢量,但在C中我希望​​它只是无效 ,你知道。

那么,什么反对像这样的解决方案

 struct Foo { #ifdef __cplusplus ... #else ... #endif }; 

或者反对为不同的编程语言提供不同的API?

AProgrammer已经给你正确的答案,但问题的“可能”部分的答案是否定的。 在处理完所有预处理程序指令之后才会发生宏扩展,因此任何扩展为#define#ifdef宏都将作为常规源文本传递给编译器,这将导致编译器牦牛。

我的英语很差,如果有语言错误和错别字,我很抱歉。

如果#ifdef不能包装宏调用,那么解决方案就不那么优雅了。

仅限g ++:您可以在选择性场合尝试此操作。 但是如果a或b中有逗号,则仍需要解决方法。 它只是基于这样的事实:__ cplusplus在C ++环境中定义为“1”而不是。

 #define SELECT1(a, b) a #define SELECT__cplusplus(a, b) b #define xcat(a,b) a##b #define concat(...) xcat(__VA_ARGS__) #define C_OR_CPP(C, CPP) concat(SELECT, __cplusplus)(C, CPP) C_OR_CPP(1, 2) 

其他环境检查__cplusplus宏,这是一个符合标准C ++的编译器应该生成的

  #define __cplusplus value 

和值应> = 199711L