extern上的这个常规const是UB吗?

时间:2019-10-02 16:14:05

标签: c const language-lawyer undefined-behavior extern

我有以下内容:

    import java.util.Scanner;
    public class Workbook {
    public static void main(String[] args) {
        String w;
        int Count = 0;
        Scanner V1 = new Scanner(System.in);
        System.out.println("Enter word: ");
        w = V1.nextLine();
        for(int i = 0; i<w.length()-1; i++){
                if (w.charAt(i) == ' ' && w.charAt(i + 1) != ' ') {
                    Count++;
                }

        }
        System.out.println("Number of words: " + (Count+1));
    }
}

我在//h.h file #pragma once struct A { int x; }; //a.c file #include "h.h" struct A* a; //b.c #include "h.h" extern struct A* const a; int main() {} 声明中添加了额外的const。添加此extern将是UB吗?

如果不是UB,那么在const内部执行以下操作将是UB?

main

2 个答案:

答案 0 :(得分:2)

是的。从附件J.2:

  
      
  • 相同对象或函数的两个声明指定了不兼容的类型(6.2.7)。
  •   

和6.2.7¶2:

  

所有引用相同对象或函数的声明均应具有兼容的类型;否则,行为是不确定的。

和6.7.3¶10:

  

要使两个合格的类型兼容,两个都应具有兼容类型的相同合格版本;类型限定符在一个或多个限定符列表中的顺序不会影响指定的类型。

答案 1 :(得分:2)

考虑以下编译单元:

#include "h.h"
extern struct A* const a;
void externalFunction(void);
int myFunction(void)
{
  struct A *p1,*p2;
  p1 = a;
  externalFunction();
  p2 = a;
  return p2-p1;
}

该标准将允许编译器基于const指令假定a的值不会由于调用externalFunction而改变。请注意,它不考虑允许外部函数修改a的可能性是否有优势。例如,在某些平台上,a通常可能受到写保护,但是外部功能(也许用另一种语言编写)可能会禁用写保护,修改a,然后重新启用保护。实现是否允许这种可能性是否有用将取决于实现声称适合的目的范围,这是委员会可能无法知道的,但是编译器作者应该知道。