【问题标题】:Unable to use #define as a value passed to prototypes, invalid code无法使用#define 作为传递给原型的值,无效代码
【发布时间】:2014-04-19 16:58:40
【问题描述】:

我正在尝试在程序代码中使用#define,类似于此(简化为骨)示例代码:

#define M 20
#define N 10

void foo(int *a) {
    if (a == M) { printf("Hello!\n"); }
    else if (a == N) { printf("Goodbye!\n"); }
return;
}
int main(void) {
    foo(M);
    return(0);
}

尝试编译时,我得到以下错误输出:

main.cpp||In function ‘void foo(int*)’:|
main.cpp|6|error: ISO C++ forbids comparison between pointer and integer [-fpermissive]|
main.cpp|10|note: in expansion of macro ‘M’|
main.cpp|7|error: ISO C++ forbids comparison between pointer and integer [-fpermissive]|
main.cpp|11|note: in expansion of macro ‘N’|
main.cpp||In function ‘int main()’:|
main.cpp|15|error: invalid conversion from ‘int’ to ‘int*’ [-fpermissive]|
main.cpp|9|error:   initializing argument 1 of ‘void foo(int*)’ [-fpermissive]|
||=== Build finished: 4 errors, 0 warnings (0 minutes, 0 seconds) ===|

现在,显然这里出了点问题。这段代码的目的是指定一个可以传递给原型的整数值,而不必在编写代码时记住整数的值。该技术似乎通常与套接字相关联使用,其中 AF_INET 和 AF_INET6 代表两个不同的整数值。这样,您就不必记住 IPv6 协议的值,如果这是您希望我们为套接字提供的值,您只需指定 AF_INET6。

问:我应该如何编写这段代码才能让它工作?

【问题讨论】:

  • 现在,显然这里出了点问题。:错误消息确实使它显而易见
  • @devnull 好的,但是通过指定 &M 而不是 M 并不能解决任何问题。它只会让事情变得更糟......
  • 为什么a 甚至是一个指针?
  • 如果你能提到你想要达到的目标会更好。
  • 为什么要将指针与固定数字进行比较?你想达到什么目标?你问的是 XY 问题恕我直言!

标签: c++ c c-preprocessor


【解决方案1】:

Foo 正在接受一个指向 Int 的指针。不是 int 值。你的定义变成了一个整数文字。并且可以在任何整数文字可以工作的地方工作。

你无法获得文字的地址。

试试:

void foo (int a) {

或者实际创建一个整数变量,并将它的地址传递给 foo,然后在 foo 中将其解引用回一个 int:

int main (void)
{

    int myVar = M;
    foo(&myvar)
}

void foo (int *a) {

    if (*a == M) { printf("Hello!\n"); }
    else if (*a == N) { printf("Goodbye!\n"); }
    return;
}

【讨论】:

  • 好的,很好的答案。但是在那种情况下:如果原型的声明是void foo(char *a) {},那么我可以使用foo("Hello!");,即使“你好!”不是字符串,而是字符串值。有什么区别?
  • "Hello" 在内部存储为 char * 类型,因此 char *str = "Hello"; 有效。 20 是 int 字面量,它不是一个点,而是一个值。它存储为int 值,因此int a = 20; 起作用。 C 字符串不是值,它们是 chars 的数组,char 是一个值。
  • @SeagulFish,不是 C++11,因为它需要是 const char *a,因为字符串文字是 const char[N]
  • 这与任何标准无关。迄今为止,C 的第一个版本仍然将指针视为存储变量的内存位置,变量只是那些可能发生变化的值(存储在内存中的某个位置),而文字是“字面意思" 该值本身不存储在内存中,并且很可能作为绝对值或汇编语言指令的操作数存储在代码段中。在开始担心常量或标准细节之前了解这一点很重要。
【解决方案2】:

您确实了解预处理器是一个非常简单的生物。

它只是将任何 M 替换为 20。即不是指针。

所以改变

 void foo(int *a) {

 void foo(int a) {

【讨论】:

    【解决方案3】:

    错误消息说明了一切。您正在将指针与整数值进行比较,而您打算将存储在指针 a 指向的位置的值与 MN 进行比较。

    【讨论】:

      猜你喜欢
      • 2021-12-21
      • 2016-10-05
      • 1970-01-01
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      相关资源
      最近更新 更多