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