小编a3f*_*a3f的帖子

如何在C中识别重新定义的宏?

我有两个大型框架库,其头文件包含在我的项目中.任何一个都可以完美地工作,但包括两者都会导致不稳定的行为(但没有与宏相关的错误消息).

我假设他们都#define一个同名的宏.识别有问题宏的最有效方法是什么?

c c-preprocessor

1
推荐指数
1
解决办法
1849
查看次数

定义#define宏

我想知道C语言中是否有一种方法可以#define像这样定义:

#define something #define
something a 42
something b 42
Run Code Online (Sandbox Code Playgroud)

c c-preprocessor

1
推荐指数
1
解决办法
631
查看次数

宏SWAP(t,x,y)交换类型为t的两个参数

所以我基本上试图创建一个交换两个t类型参数的SWAP(t,x,y)宏.当这两个参数形成时,我试图想到解决这个问题

v [i ++]和w [f(x)],即SWAP(int,v [i ++],w [f(x)]).

下面的代码基本上崩溃了......

#define SWAP(T,x,y) {T *p = x; T *q = y; T z = *p; *p = *q; *q = z;}

int f (int x){
    return (0-x);
}

int main(void) {

int v[] = {1,2,3};
int i = 0;

int w[] = {4,5,6};
int x = -1;

int *p = v;
int *q = w;

SWAP(int*, v[i++],w[f(x)]);

return 0;
}
Run Code Online (Sandbox Code Playgroud)

什么想法可能会出错?

c swap pointers c-preprocessor

1
推荐指数
1
解决办法
5534
查看次数

作业宏写作

我正在尝试为for循环中的以下重复代码编写一个宏.

for(i=0; i<n; i++) {
 a->x = b->x;
 a->y = b->y;
 a->z = b->z;
}
for(j=0;j<n;j++){
 a->x = c->x;
 a->y = c->y;
 a->z = c->z;
}

---------
with macro
#define COPY(x,y,z) \
a->x = x;\
a->y = y;\
a->z = z;\

for(i=0;i<n;i++)
 COPY(b->x,b->y,b->z);
for(i=0;i<n;i++)
 COPY(c->x,c->y,c->z);
Run Code Online (Sandbox Code Playgroud)

我之前一直得到错误的意外表达;


感谢快速回复,看起来我更倾向于函数调用而不是宏,因为它可能会加速繁琐.是否有使用函数调用而不是宏的性能影响?

c c-preprocessor

1
推荐指数
1
解决办法
374
查看次数

需要帮助Vim Regular Expression

我尝试使用正则表达式来捕获以下模式:

我想要包含az中的字符,但排除e,fg 我知道Vim中的字符类

[^efg]
Run Code Online (Sandbox Code Playgroud)

不包括字符:e,fg

我试过了正则表达式

%s/[a-z[^efg]]//gc
Run Code Online (Sandbox Code Playgroud)

但它没有捕捉到我想要的东西

regex vim

1
推荐指数
1
解决办法
50
查看次数

在C99中的宏中使用true和false

我正在使用支持C99子集的自定义gcc编译器编写一些代码.使用编译器选项我定义了一个像这样的宏:

ENABLE_LOGGING=true
Run Code Online (Sandbox Code Playgroud)

我在我的代码中使用它,如下所示:

#if ENABLE_LOGGING
#define LOG(foo) { log(foo); }
#else
#define LOG(foo)
#endif
Run Code Online (Sandbox Code Playgroud)

事实证明,这不能可靠地运作.有时使用LOG包含代码,有时使用emtpy LOG(相同的项目,相同的编译器设置).

将宏参数更改为:

ENABLE_LOGGING=1
Run Code Online (Sandbox Code Playgroud)

一切正常.

据我所知,true预处理器可能不知道.但是,为什么它最常用?为什么在编译它不起作用的模块时,我没有得到任何警告或错误?

c boolean c99 c-preprocessor preprocessor-directive

1
推荐指数
1
解决办法
179
查看次数

用C++定义二进制宏

有人可以解释为什么会发生以下错误:

    #define bla "\xA"
    char a [2] = {0};
    memcpy (a,bla,1); // a[0] = 0x0a <- Correct
    //a[1] = bla;     // '=' : cannot convert from 'const char [2]' to 'char'
Run Code Online (Sandbox Code Playgroud)

谢谢,

R M

c++ c-preprocessor

0
推荐指数
1
解决办法
433
查看次数

在#define宏中嵌入if语句

我正在阅读一篇文章,其中#define宏是这样制作的:

#define TEST(level) if (level > 2) ; else std::cout
Run Code Online (Sandbox Code Playgroud)

然后可以在代码中使用,如下所示:

Test(1) << 3;
Test(3) << 4;
Run Code Online (Sandbox Code Playgroud)

我的印象是,如果你写的

TEST(1)
Run Code Online (Sandbox Code Playgroud)

它将取代它:

std::cout
Run Code Online (Sandbox Code Playgroud)

TEST(3)
Run Code Online (Sandbox Code Playgroud)

将被替换为空字符串(在代码文件中).但是,如果它以这种方式工作,那么它应该抛出一个错误,因为

<< 3;
Run Code Online (Sandbox Code Playgroud)

是无效的.

这个宏实际上如何工作?以及预处理器如何变化

TEST(3) << 3;
Run Code Online (Sandbox Code Playgroud)

所以它不输出任何东西(也就是代码不运行)

c++ c-preprocessor

0
推荐指数
1
解决办法
1547
查看次数

在c中使用#define

#include<stdio.h>
#include<stdlib.h>

#define d 10+10

int main()
{
    printf("%d",d*d);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

我是宏的概念的新手.我发现上面程序的输出是120.它背后的逻辑是什么?

谢谢.

c c-preprocessor

0
推荐指数
1
解决办法
694
查看次数

应该包含整数溢出的以下代码的正确答案应该是什么?

我在下面的代码部分与一组同事就该问题的正确答案进行了长时间的讨论.我依赖于stackoverflow.com上的一些讨论关于我的答案的有符号整数溢出.所以,我告诉他们,选择应该包含"未定义的行为",它应该是正确的答案.但是他们说答案应该是(C),并且他们在提供相同问题和答案的许多网站上提供了相同问题的一些链接.我将引用他们提供的链接中提出的问题,答案和解释.那么,正确答案应该是什么?谢谢

  1. 如果要编译并执行以下c代码,将输出什么?
#include<stdio.h>
int main() {
    char c=125;
    c=c+10;
    printf("%d",c);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

选择:

(A) 135
(B) +INF
(C) -121
(D) -8
(E) Compiler error
Run Code Online (Sandbox Code Playgroud)

说明:

As we know char data type shows cyclic properties i.e. if you will increase 
or decrease the char variables beyond its maximum or minimum value 
respectively it will repeat same value according to following cyclic     
order:
So,
125+1= 126
125+2= 127
125+3=-128
125+4=-127
125+5=-126
125+6=-125
125+7=-124
125+8=-123
125+9=-122
125+10=-121
Answer: (C)
Run Code Online (Sandbox Code Playgroud)

c

0
推荐指数
1
解决办法
103
查看次数

如何在C中标记和强化__func__宏?

我想用宏来标记强化我们所在函数的名称,以便在C中重载函数(使用dlopen()).

我用__LINE__和发现了类似的东西__FILE__,但在__func__...... 的情况下似乎有点不同

我试过了:

#define OVERLOAD2(f) printf("Trying to overload function %s...", #f)
#define OVERLOAD1(f) OVERLOAD2(f)
#define OVERLOAD OVERLOAD1(__func__)

int main() {
    OVERLOAD;
}
Run Code Online (Sandbox Code Playgroud)

使用不同的编译标准(c99,gnu11)进行编译不会改变结果; 而不是印刷:

Trying to overload function main...
Run Code Online (Sandbox Code Playgroud)

它打印:

Trying to overload function __func__...
Run Code Online (Sandbox Code Playgroud)

我该如何纠正这些宏?

c c-preprocessor

-1
推荐指数
1
解决办法
116
查看次数

在 C++11 中使用 cin 作为输入复数

#include <iostream>
#include <complex>
using namespace std;

int main(){
    complex<double> p;
    cin >> p.real() >> p.imag();
}
Run Code Online (Sandbox Code Playgroud)

在 g++4.7.2 中它成功运行,但在 C++11 中编译失败。为什么?

它给了我以下错误消息:

prog.cpp: In function ‘int main()’:
prog.cpp:7:19: error: no match for ‘operator>>’ in ‘std::cin >> p.std::complex<double>::real()’
Run Code Online (Sandbox Code Playgroud)

完整版:http : //ideone.com/M3BhVR

complex-numbers c++11

-2
推荐指数
1
解决办法
3218
查看次数