get_cpu_var marcro,定义如下 29 #define get_cpu_var(var) (*({ \ 30 extern int simple_identifier_##var(void); \ 31 preempt_disable(); \ 32 &__get_cpu_var(var); })) 似乎是不可理解的。我假设它是一种函数宏,它返回一个变量指针(基于星号)或者它是某种函数指针。我甚至接近它?有人能启发我吗?
MSVC编译器表示不推荐使用fopen() ,并建议使用fopen_s() 。 有没有办法使用fopen_s()并仍然可移植? #define任何想法?
我知道我可以这样做: #define MACRO(api, …) \ bool ret = api(123, ##__VA_ARGS__); 这只是一个例子,它是更复杂的解决方案的一部分。 关键是我需要将可变数量的参数附加到第一个123. ##使编译器在123参数之后删除逗号,如果没有参数传递给MACRO。 但现在我想向api附加参数,如下: #define MACRO(api, …) \ bool ret = api(__VA_ARGS__##, 456); 诺坎多。 一种解决方案是使用两个宏,MACRO和MACRO_V,并使_V版本不处理任何参数。 但有没有办法让它与一个宏一起工作?
我想知道是否有一个glibc函数,我可以使用gcc / g ++来检索当前的可执行文件。 这样做的目的是为addr2line提供-e参数,如本答案所示
我有这样的function: #include jmp_buf buf; void func2(int g); extern int some_global; void func(int x) { if (setjmp(buf)) return; if (some_global) x += 5; func2(x); } GCC(gcc(Debian 4.4.5-8)4.4.5)发出警告: test.c:在函数’func’中: test.c:5:警告:参数’x’可能被’longjmp’或’vfork’破坏[-Wclobbered] 为什么???? 我的意思是,显然我不在乎x是否被破坏,因为它在setjmp返回后不可能被使用。 即使编译器应该知道一些非常明显的东西,因为它具有某种特殊的setjmp知识。 我的主要兴趣是找到我inheritance的代码库中的错误,因此,“使用这种编码风格代替”并不是我正在寻找的建议。 然而,这里有许多奇怪的曲折。 例如,如果x是局部变量而不是参数,那么GCC不会抱怨。 此外, if (some_global)没有if (some_global)行,GCC不会抱怨。 尼斯。 有些事情搞砸了GCC的流量分析,或者GCC知道我不知道的事情。 所以, 是否有一种简单的方法来抑制此函数的此警告,就像将未使用的参数转换为(void) ? 或者我只是在项目范围内禁止警告? 或者我错过了什么? 更新:让我与您分享一个不会产生警告的略有不同的版本: #include jmp_buf buf; void func2(int g); extern int some_global; […]
我将从最终的问题开始:在C中使用gcc,是否有可能获得__func__ (或等效地, __FUNCTION__ )的值存储在除.rodata (或者任何地方-mrodata= points)或子部分之外的部分中其? 完整的解释: 假设我有一个记录宏: #define LOG(fmt, …) log_internal(__FILE__, __LINE__, __func__, fmt, ##__VA_ARGS__) (当且仅当__VA_ARGS__列表为空时,在该一元上下文中使用的字符串连接运算符##使用前面的逗号,从而允许使用带或不带参数的格式字符串。) 然后我可以正常使用宏: void my_function(void) { LOG(“foo!”); LOG(“bar: %p”, &bar); } 可能打印(显然取决于log_internal的实现): foo.c:201(my_function) foo! foo.c:202(my_function) bar: 0x12345678 在这种情况下,格式字符串( “foo”和”bar: %p” )和预处理器字符串( “foo.c”和”my_function” )是匿名只读数据,它们会自动放入.rodata部分。 但是说我希望他们去另一个地方(我在一个嵌入式平台上运行几乎所有内存来自RAM以获得速度,但内存限制正在推动将一些东西转移到ROM中)。 移动__FILE__和格式字符串“很容易”: #define ROM_STR(str) (__extension__({static const __attribute__((__section__(“.rom_data”))) char __c[] = (str); (const char *)&__c;})) #define LOG(fmt, …) […]
向量化代码是一个好主意吗? 在什么时候这样做有什么好的做法? 下面会发生什么?
好吧,我一直在尝试使用这个时间最长,我似乎无法让它正常工作。 我有三个文件, main.c , hello_world.c和hello_world.h 。 无论出于什么原因,他们似乎没有很好地编译,我真的无法弄清楚为什么…… 这是我的源文件。 首先hello_world.c: #include #include “hello_world.h” int hello_world(void) { printf(“Hello, Stack Overflow!\n”); return 0; } 然后hello_world.h,简单: int hello_world(void); 最后是main.c: #include “hello_world.h” int main() { hello_world(); return 0; } 当我把它放入GCC时,这就是我得到的: cc main.c -o main /tmp/ccSRLvFl.o:在函数`main’中: main.c :(。text + 0x5):未定义引用`hello_world’ collect2:ld返回1退出状态 make:*** [main]错误1 有人能帮帮我吗? 我真的坚持这个,但我99%肯定这是一个非常简单的修复。
在C中,我有一个任务,我必须进行乘法,反演,trasposition,add等等,将巨大的矩阵分配为二维数组(数组的数组)。 我找到了gcc标志-funroll-all-loops 。 如果我理解正确,这将自动展开所有循环,而无需程序员的任何努力。 我的问题: a) gcc是否包含这种优化,各种优化标志为-O1 , -O2等? b)我是否必须在代码中使用任何pragma来利用循环展开或自动识别循环? c)如果展开提高了性能,为什么默认情况下不启用此选项? d)以尽可能最好的方式编译程序的推荐gcc优化标志是什么? (我必须运行这个针对单个CPU系列优化的程序,这与我编译代码的机器相同,实际上我使用march=native和-O2标志) 编辑 似乎存在关于使用展开的争议,在某些情况下可能会降低性能。 在我的情况下,有各种方法可以简单地将数学运算嵌套在循环中,以便为大量元素完成迭代矩阵元素。 在这种情况下,展开如何减慢或提高性能?
是否可以将变量类型作为函数参数的一部分传递,例如: void foo(varType type) { // Cast to global static unsigned char bar; bar = ((type *)(&static_array))->member; } 我记得它与GCC的typeof和使用宏有关吗?