Tag: preprocessor directive

使用GCC在C中的函数重载 – 具有多个参数的函数

在前面的一个问题中,当每个函数只接受一个参数时,我找到了一种在C99中重载函数的方法。 请参阅以下内容中的答案: C中的函数重载使用GCC – 编译器警告以获取详细信息。 现在我已经找到了使用单个参数函数的方法,我想知道如何对带有多个参数的函数进行此操作。 我假设它将与__VA_ARGS__和使用…但我似乎无法找到任何有效甚至想要编译的东西。 这适用于带有2个参数的打印: #define print(x, y) \ __builtin_choose_expr(__builtin_types_compatible_p(typeof(x), int) && \ __builtin_types_compatible_p(typeof(y), int), print_int, \ (void)0)(x, y) 但如果我还想要另一个带有一个参数的版本,我就无法重新定义它。 添加这将给我一个错误,说重新定义print : #define print(x) \ __builtin_choose_expr(__builtin_types_compatible_p(typeof(x), char[]), print_string, \ (void)0)(x) 如何重载打印,以便它可以使用2个整数作为输入或字符数组? 示例用法: print(1, 2); print(“this”); 或者甚至更好……我怎样才能使它与任何类型的组合或任意数量的参数一起使用? 还要记住,因为这是C99,_Generic关键字不可用。

像#include这样的预处理器指令是否只能放在程序代码的顶部?

我在函数内部使用了#pragma指令,没有错误或警告(特别是#pragma pack() )。但是下面的代码显示了incompatible implicit declaration of built-in function ‘printf’|的警告incompatible implicit declaration of built-in function ‘printf’| : int main(void) { printf(“Trial”); } #include 此外,这里是我所拥有的一本书的摘录。作者对SO的评价很差,特别是对于他对void main()慷慨使用,但我觉得没有作者可以如此不好地声称以下内容: 这些预处理程序指令中的每一个都以#符号开头。 指令可以放在程序的任何位置,但通常放在程序的开头,在第一个函数定义之前。 那么你能否告诉我是否必须在程序的顶部使用#include之类的预处理程序指令,而其他像#pragma这样的程序可以在程序的任何地方使用? 编辑在OUAH的评论之后我尝试了以下内容,但它没有发出警告,它给出了一大堆错误 .LOL。 int main(void) { #include printf(“Trial”); }

-Werror导致编译器在#warning上停止。 我该怎么做才能防止这种情况发生?

首先,我希望它停止警告。 但我也希望打印出一些信息性的消息(比如“回来实现这个!”)。 不幸的是,我的编译器不支持#info #message , #pragma message() , #pragma message()等。 我知道有-Wno-error= ,但我的google-foo很弱,我似乎无法找到#warning的 。 我试过-Wno-error=warning ,只是说“没有 – -Wwarning ”。 与“ warn ”相同。 有什么建议? 值得一提的是,我使用的是Tensilica xtensa编译器,xt-xcc,它似乎是一个gnu派生词,或者至少使用了gnu前端。 它的版本是8.0.0。

制作C标识符和字符串?

假设您要生成标识符和字符串的匹配列表 enum { NAME_ONE, NAME_TWO, NAME_THREE }; myFunction(NAME_ONE, “NAME_ONE”); myFunction(NAME_TWO, “NAME_TWO”); myFunction(NAME_THREE, “NAME_THREE”); ..没有重复自己,没有自动生成代码,使用C / C ++宏 初步猜测: 您可以添加包含的#include文件 myDefine(NAME_ONE) myDefine(NAME_TWO) myDefine(NAME_THREE) 然后使用它两次: #define myDefine(a) a, enum { #include “definitions” } #undef myDefine #define myDefine(a) myFunc(a, “a”); #include “definitions” #undef myDefine 但#define不允许你把参数放在一个字符串中?

程序执行总是从C中的main开始吗?

必须从main开始执行程序,还是可以修改起始地址? #include void fun(); #pragma startup fun int main() { printf(“in main”); return 0; } void fun() { printf(“in fun”); } 这个程序in main之前打印出来。