C++ C/C++#在宏中定义宏?

C++ C/C++#在宏中定义宏?,c++,c,c-preprocessor,C++,C,C Preprocessor,我想要一些像: #define C_OR_CPP(C__, CPP__) #ifdef __cplusplus\ CPP__\ #else\ C__\ #endif 可能吗? 也许是一些肮脏的黑客,包括 原因: 我制作了一个标头,其中结构使用类型为vector*的成员变量,但在C中,我希望它只是void*,你知道 TIA 不在C++中。但是你可以 #ifdef __cplusplus # define CPP #else # define C #endif 我想这只是你的一个病态例子。还请

我想要一些像:

#define C_OR_CPP(C__, CPP__) #ifdef __cplusplus\
CPP__\
#else\
C__\
#endif
可能吗? 也许是一些肮脏的黑客,包括

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


TIA

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

#ifdef __cplusplus
# define CPP
#else
# define C
#endif
我想这只是你的一个病态例子。还请注意,双下划线保留给库实现者(请参阅17.6.4.3.2全局名称)

向量,但在C中,我希望它是空的,你们知道

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

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

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

问题出在哪里

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

(根据phresnel备注,在实现中留下双下划线)

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

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

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

仅限g++版: 你可以在有选择的场合试试这个。但如果a或b中有逗号,则仍然需要解决方法。 这是基于在C++环境中,当将Apple的CPLUS添加到“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)
其他环境 请检查“y-cPulsPux宏”,符合标准C++的编译器应该生成

 #define __cplusplus value 

值应该>=199711L

您的意思是,在您的示例中,
CPP
将是
vector*
C
将是
void*
?那很好,我没想过。在没有其他解决方案的情况下会考虑它。不同的API:不,我实际上在研究一个程序,它相信世界上的一切都是从一个规则中派生出来的,并且应该简化它(在我头脑中有这么多年的哲学,现在编写一个适合它的程序)。(解决方案示例):看起来非常不干净,更难阅读。为什么不问问更好的呢=D@imacake我对规则的事情感到困惑,这与C和C++有什么关系?头将被C和C++程序使用。在C中,显然没有<代码>向量*/COD>。C或C++程序将给予它由驻留在共享库中的特殊管理部分来管理。代码还不多,但如果您希望在运行时加载类,请遵循它。我所看到的每种情况都是这样做的。例如,此模式用于根据使用的编译器(例如gcc或IAR或Keil)为
(意味着给定的函数定义可以被另一个编译单元中具有相同名称的函数定义替换,而不是使用多个定义错误停止链接器)定义宏,我听说你喜欢宏?@Gui13对不起,但你们都想要什么?在C++和C?@ imaKaKE中,你还用了什么头?嘿,对不起,我只是引用了一个很差的。无意冒犯:-)不确定这会给@AProgrammer接受的答案增加什么